studio programacion móviles libros libro desarrollo desarrollar curso aprende aplicaciones java byte unsigned signed

java - móviles - manual de programacion android pdf



¿Cuál es la mejor manera de evitar el hecho de que TODOS los bytes de Java están firmados? (7)

En Java, no existe un byte sin signo.

Al trabajar con un código de bajo nivel, ocasionalmente necesita trabajar con bytes que tienen valores sin signo mayores a 128, lo que hace que Java los interprete como un número negativo debido a que el MSB se usa para el signo.

¿Cuál es una buena manera de evitar esto? (Decir que no use Java no es una opción)



Al leer cualquier valor único de la matriz, cópielo en algo así como un breve o un int y convierta manualmente el número negativo en el valor positivo que debería ser.

byte[] foobar = ..; int value = foobar[10]; if (value < 0) value += 256 // Patch up the ''falsely'' negative value

Puede hacer una conversión similar al escribir en la matriz.


Supongo que podrías usar un short para almacenarlos. No es muy eficiente, pero realmente es la única opción además de un esfuerzo hercúleo que he visto.


La mejor forma de hacer manipulación de bits / bytes sin firmar es mediante el uso de int s. A pesar de que están firmados, tienen un montón de bits de repuesto (32 en total) para tratar como un byte sin signo. Además, todos los operadores matemáticos convertirán números de precisión fijos más pequeños en int . Ejemplo:

short a = 1s; short b = 2s; int c = a + b; // the result is up-converted short small = (short)c; // must cast to get it back to short

Debido a esto, es mejor quedarse con un entero y enmascararlo para obtener los bits que le interesan. Ejemplo:

int a = 32; int b = 128; int foo = (a + b) | 255;

Aquí hay más información sobre los tipos primitivos de Java http://mindprod.com/jgloss/primitive.html

Una última nota trivial, hay un número fijo de precisión sin firmar en Java. Ese es el primitivo char .


Usar ints es generalmente mejor que usar short porque java usa valores de 32 bits internamente de todos modos (incluso para bytes, a menos que esté en una matriz) así que usar ints evitará la conversión innecesaria a / desde valores cortos en bytecode.


Sé que esta es una respuesta muy tardía, pero encontré este hilo cuando trato de hacer exactamente lo mismo. El problema es simplemente tratar de determinar si un byte de Java es> 127.

La solución simple es:

if((val & (byte)0x80) != 0) { ... }

Si el problema real es> 128 en su lugar, solo agregar otra condición a esa declaración if hará el truco.


@pauldoo

En realidad, es posible deshacerse de la declaración if y la adición si lo haces así.

byte[] foobar = ..; int value = (foobar[10] & 0xff);

De esta forma, Java no interpreta el byte como un número negativo y también gira el bit de signo en el entero.