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

StackOverflow https://stackoverflow.com/questions/11088

  •  08-06-2019
  •  | 
  •  

Pregunta

En Java, no existen los bytes sin firmar.

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

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

¿Fue útil?

Solución

Al leer cualquier valor único de la matriz, cópielo en algo como short o 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 realizar una conversión similar al escribir en la matriz.

Otros consejos

De hecho, es posible deshacerse de la declaración if y de la adición si lo hace así.

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

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

Usar ints es generalmente mejor que usar shorts porque Java usa valores de 32 bits internamente de todos modos (incluso para bytes, a menos que esté en una matriz), por lo que usar ints evitará conversiones innecesarias hacia/desde valores cortos en el código de bytes.

Probablemente lo mejor que puede hacer es utilizar un número entero en lugar de un byte.Tiene espacio para permitir números mayores que 128 sin la sobrecarga de tener que crear un objeto especial para reemplazar el byte.

Esto también lo sugieren personas más inteligentes que yo (todos)

La mejor manera de realizar manipulación de bits/bytes sin firmar es mediante el uso En ts.Aunque están firmados, tienen muchos bits de repuesto (32 en total) para tratarlos como un byte sin firmar.Además, todos los operadores matemáticos convertirán números de precisión fija más pequeños en En t.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 seguir con el número 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 de precisión fijo sin signo en Java.Eso es el carbonizarse primitivo.

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

La solución sencilla es:

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

Si el problema real es >128, simplemente agregar otra condición a esa declaración if será suficiente.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top