Matriz de bytes (como hex) conversión al problema Int. (Kotlin / Java)

Mannie:

Estoy buscando a analizar la información de un sensor de temperatura / humedad que se proporcionó con las siguientes instrucciones;

Hay 6 bytes.

  1. positivo de temperatura / negativo: 0 significa positivo (+) y 1 significa negativo (-)

  2. Parte entera de la temperatura. Mostrar en hexadecimal.

  3. parte decimal de la temperatura. Mostrar en hexadecimal.

  4. byte reservado. Ignoralo.

  5. Entero parte de la humedad. Mostrar en hexadecimal.

  6. parte decimal de la humedad. Mostrar en hexadecimal.

Por ejemplo: 00 14 05 22 32 08 medios 20.5C + 50,8% y 01 08 09 00 14 05 medios -8.9C 20,5%

ya que cada byte es en hexadecimal y necesito para convertir esto a un Int I seguido este enfoque - código Java para convertir bytes en hexadecimal , pero los valores que recibo al validar su ejemplo no hacer sense.In Kotlin yo;

val example = byteArrayOf(0, 14, 5, 22, 32, 8)
example.map { Integer.parseInt(String.format("%02X ", it),16)}

Primer ejemplo de salida es;

0 = "00 "
1 = "08 "
2 = "09 "
3 = "00 "
4 = "0E "
5 = "05 "

salida Segundo ejemplo;

0 = "00 "
1 = "0E "
2 = "05 "
3 = "16 "
4 = "20 "
5 = "08 "

¿Qué estoy haciendo mal? Estoy empezando a pensar en las instrucciones del fabricante podrían 'engañosa'

Matt:

Una cosa clave se echa en falta aquí es que cuando se pasa en el itparámetro a String#format, ese valor es un decimal int , no un hexadecimal int .

En su lugar, desea asignar el valor de la matriz directamente a una cadena, a continuación, obtener su valor decimal:

byte it = 14;
int x = Integer.parseInt(String.valueOf(it), 16);
System.out.println(x); // This will print 20

Esto debe obtener el resultado esperado.


Tenga en cuenta, su problema es un poco confuso ya que los números de la matriz de bytes son números decimales ... ya en su 'formato' hexagonal. Hay algunas maneras esta confusión puede ser fijo (suponiendo que tiene el control del tipo y / o el contenido de la matriz):

  • Utilizar Stringen lugar debyte
String it = "14";
int x = Integer.parseInt(it, 16);
System.out.println(x); // This will print 20
  • Almacenar los valores como hex y todavía convertir (es decir, poniendo una 0xen frente de cada número)
byte it = 0x14;
int x = Integer.parseInt(String.format("%02X", it), 16);
System.out.println(x); // This will print 20
  • Almacenar los valores como hexagonal y no convertir, porque no hay necesidad
byte it = 0x14;
System.out.println(it); // This will print 20

Si vas con el segundo punto, aunque enrevesado, lo que tienes ahora debería funcionar, pero la tercera opción sería mejor si está codificando en los valores de la matriz de bytes.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=235646&siteId=1
Recomendado
Clasificación