[RESOLVIDO] Conversão de Tipos (int > String(hex) > byte)

Fala galera… Estou com um problema que não consigo resolver há uns dois dias.

Preciso enviar dados por rede utilizando dados em Bytes. Isso não é relevante no momento. É apenas o motivo para eu fazer o que preciso fazer…

Tenho a seguinte variável:

Integer sequencia = 10

E preciso que ela seja convertida para hexadecimal:

String sequenciaStr = String.format("%02X", sequencia);

Após isso, preciso criar um array de bytes e um dos valores desse array de bytes é justamente o valor dessa variável em hexa:

 byte[] dados = new byte[]{var1,
                    var1,
                    var1,
                    var1,
                    var1,
                    Byte.decode(sequenciaStr)
                };

O problema é que não consigo converter o valor da variável sequenciaStr para byte. Já tentei Byte.decode, Byte.valueOf e sequenciaStr.byteValue(), mas nada.
Quando o valor de sequencia era menor que 10, não dava erro.

O erro que tá dando é o seguinte:

For input string: "A"
java.lang.NumberFormatException: For input string: "A"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
        at java.lang.Integer.parseInt(Integer.java:449)
        at java.lang.Byte.parseByte(Byte.java:151)
        at java.lang.Byte.valueOf(Byte.java:184)
        at java.lang.Byte.decode(Byte.java:288)
        at org.apache.jsp.sistema.jsp.comandos.mmAlertaBloqueio_jsp._jspService(mmAlertaBloqueio_jsp.java:127)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:662)

Muito obrigado e abraços

Tente isso:

int valor = 1454352534; byte[] bytes = Integer.toHexString(valor).getBytes();

Se não der tente gerar na base 64 e não 10.

dreampeppers99, não funcionou.
Ele retorna um array de bytes e eu preciso transformar isso em apenas um byte, se for possível, como abaixo.

    byte[] dados = new byte[]{var1,  
                       var2,  
                       var3,  
                       var4,  
                       var5,  
                       Byte.decode(sequenciaStr)  
                   };  

Ou não entendi direito ou eu penso que é impossível você “compactar” um array de byte pra um byte sem perda de dados.

Você tá misturando tipos de dados com Sistemas Numéricos, primeiro você tem que decidir se
vai converter um decimal para hexadecimal , ou binário para decimal tem que definir uma padrão
de entrada pra sua sequência.

public class Converte{
  public static void main(String args[]){
    int decimal = 15;
    
    // efetua a conversão de decimal para
    // hexadecimal
    String hex = Integer.toHexString(decimal);

    // exibe o resultado
    System.out.println(decimal + " em hexadecimal é: " +hex);

    System.exit(0);
  }
} 

Eu estava enganado.
Eu estou refazendo um software que fiz em C# e apenas me atentei ao código, e não ao que deve ser feito.

Em C# eu tenho:

 byte[] dados = { var,
                          var,
                          var,
                          var,
                          var,
                          var,
                                       Convert.ToByte(int.Parse(Int16.Parse(sequencia).ToString("X2"),System.Globalization.NumberStyles.HexNumber)),
                          var};

Pelo fato te haver muito código, eu imaginei que precisaria passar os dados inteiro pra hexa e depois pra byte. Analisei o código e percebi que não preciso de tudo isso.
Passei apenas como

sequencia.byteValue()

e resolveu.

Agora estou com outro problema. Preciso converter um inteiro para hexa, mas ele deve vir com um formato especifico.
Em C# eu faço do seguinte modo:

String.Format("{0:X4}",1243646787);

e é retornado o valor 2ED1;

Em Java estou fazendo

String.format("%02x", 1243646787);

, mas o valor retornado é 4A208B43.
O que preciso é encontrar um modo de retornar o mesmo valor.

Peço desculpas se continuo com outra dúvida no mesmo post. Não estou acostumado a pedir ajuda por que sempre encontro o que preciso em outros posts.
Caso seja necessário, posso criar um outro tópico.

Muito obrigado pela atenção =)

O que vc está fazendo é converter um número inteiro em uma representação String do seu valor em hexadecimal. Ou seja, um valor como 30.000, que pode ser representado com apenas 2 bytes, será enviado como o texto "7530", o que ocupa 8 bytes em unicode, ou 4 bytes em ascii.

Em termos de protocolo de redes, isso é extremamente ineficiente.

Se você quer realmente enviar os dados no formato binário, use um DataOutputStream/DataInputStream. Ou separe os bytes de seu inteiro usando operações bitwise:

int byte1 = seuInteiro & 0xFF; int byte2 = (seuInteiro >> 8) & 0xFF; int byte3 = (seuInteiro >> 16) & 0xFF; int byte4 = (seuInteiro >> 32) & 0xFF;

Outra forma de trabalhar com bytes brutos é usar a classe ByteBuffer do Java. Ela funciona em conjunto com a classe FileChannel, e faz parte do pacote java.nio. Além de mais rápido, o ByteBuffer já trata detalhes como endianess (ordem dos bytes).

Em C# você também pode trabalhar com o formato dos dados em binário, usando operadores bitwise muito similares.

PS: O que faz o trabalho do DataInputStream/DataOutputStream no C# é o BinaryReader e o BinaryWriter:

A diferença é que no C# existe os métodos que acho que também deveriam existir no Java, para tratar dados sem sinal.

Galera, desculpe o tempo demorado pra responder, mas o tempo andou bastante escasso.
Consegui resolver o problema com a dica do ViniGodoy.

Percebi que usando as seguintes linhas

int byte1 = seuInteiro & 0xFF;  
int byte2 = (seuInteiro >> 8) & 0xFF; 

consigo o resultado inverso, então só foi necessário usar

String minhaVar = String.format("%X", byte2) + String.format("%X", byte1);

Obrigado a todos pela ajuda =)

P.S. Como coloco o tópico como resolvido? Ou é a moderação que faz isso?

Basta editar a sua primeira postagem adicionando [RESOLVIDO] no inpicio do assunto.

Abraço!