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)
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.
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.