2 bytes a corto java

Estoy leyendo 133 paquetes de longitud de serialport, los últimos 2 bytes contienen valores de CRC, valor de 2 bytes que he hecho solo (en pocas palabras, creo) usando java. esto es lo que hice

short high=(-48 & 0x00ff); short low=80; short c=(short) ((high<<8)+low); 

pero no obtengo el resultado correcto, ¿es un problema porque firmó un valor? ¿Cómo puedo resolver este problema? Por favor, ayúdame, estoy en problemas.

Recuerda, no tienes que hacerte nudos con un cambio de bit si no estás muy familiarizado con los detalles. Puede usar un ByteBuffer para ayudarlo:

 ByteBuffer bb = ByteBuffer.allocate(2); bb.order(ByteOrder.LITTLE_ENDIAN); bb.put(firstByte); bb.put(secondByte); short shortVal = bb.getShort(0); 

Y viceversa, puedes poner un cortocircuito, y luego sacar los bytes.

Por cierto, las operaciones a nivel de bit promueven automáticamente los operandos a al menos el ancho de un int. Realmente no existe la noción de “no poder cambiar un byte más de 7 bits” y otros rumores que parecen estar dando vueltas.

Al convertir valores de bytes de una secuencia en valores numéricos en Java, debe tener mucho cuidado con la extensión de los signos. Hay una trampa con números negativos (valores de (sin signo) 128-255).

Pruebe esto (funciona si hi y lo son cualquier tipo de entero de Java):

 short val=(short)(((hi & 0xFF) << 8) | (lo & 0xFF)); 

Encuentro que es mejor ser explícito con los paréntesis en estos casos.

Las otras respuestas están bien, pero me gustaría poner énfasis en el tipo:

 short high=(-48 & 0x00ff); short low=80; int c= ((high & 0xFF) << 8) | (low & 0xFF); 

El tipo short puede representar valores entre -32768 a 32767. 53328 no se puede almacenar en pocas palabras, utilice int lugar, ya que le permite almacenar valores sin signo de hasta ~ 10 9 Por lo tanto, no disminuya la expresión a abreviatura, ya que generará el valor firmado.

Esto ocurre cuando intentas concatenar bytes (muy sutiles)

 byte b1 = (byte) 0xAD; byte b2 = (byte) 0xCA; short s = (short) (b1<<8 | b2); 

Lo anterior produce 0xFFCA, lo cual es incorrecto. Esto se debe a que b2 es negativo (¡el tipo de byte está firmado!), Lo que significa que cuando se convertirá en tipo int para el bit-wise | operación, será rellenado a la izquierda con 0xF!

Por lo tanto, debe recordar enmascarar los bytes rellenos para que definitivamente sean cero:

 short s = (short) (b1<<8 | b2 & 0xFF); 

Puede convertir 2 bytes a un corto de una manera más legible y elegante.

 short s = ByteBuffer.wrap(new byte[]{0x01, 0x02}).getShort(); // now s equals 258 = 256 + 2 

El primer byte es el byte más significativo.