precios libro electrónico electronico electronic ebooks ebook definicion books java type-conversion byte core short

libro - 2 bytes a corto java



libro electronico (5)

Estoy leyendo 133 paquetes de longitud de serialport, los últimos 2 bytes contienen valores CRC, valor de 2 bytes que he hecho solo (corto, creo) utilizando Java. esto lo que he hecho,

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

pero no estoy obteniendo el resultado correcto, ¿es un problema porque está valuado? ¿Cómo puedo resolver este problema? Por favor, ayúdame, estoy en problemas.


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

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


Esto sucede cuando se intenta 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á a tipo int para el bit-sabio | Operación, será rellenado a la izquierda con 0xF!

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

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


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 y 32767. 53328 no puede almacenarse bien en breve, use int lugar, ya que le permite almacenar valores sin firmar de hasta ~ 10 9 Por lo tanto, no reduzca la expresión a corto, ya que le reducirá. El valor firmado.


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.


Recuerde, no tiene que atarse en nudos con un poco de cambio si no está demasiado familiarizado con los detalles. Puedes usar un ByteBuffer para ayudarte:

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

Y viceversa, puede poner un byte corto y luego extraerlo.

Por cierto, las operaciones a nivel de bits promueven automáticamente los operandos a al menos el ancho de un int. Realmente no hay noción de que "no se le permita cambiar un byte de más de 7 bits" y otros rumores que parecen estar circulando.