¿Lee Java enteros en little endian o big endian?
endianness (6)
Lo pregunto porque estoy enviando un flujo de bytes de un proceso C a Java. En el lado C, el entero de 32 bits tiene el LSB es el primer byte y el MSB es el 4º byte.
Entonces mi pregunta es: en el lado de Java cuando leemos el byte tal como fue enviado desde el proceso C, ¿qué es endian en el lado de Java?
Una pregunta de seguimiento: si el endian en el lado de Java no es el mismo que el enviado, ¿cómo puedo convertir entre ellos?
Leería los bytes uno por uno y los combinaría en un valor largo . De esa forma, usted controla la endianidad y el proceso de comunicación es transparente.
Me tropecé aquí a través de Google y obtuve mi respuesta de que Java es un gran endian.
Leyendo a través de las respuestas me gustaría señalar que los bytes sí tienen un orden endian, aunque afortunadamente, si solo ha tratado con microprocesadores "convencionales", es poco probable que lo haya encontrado nunca como Intel, Motorola y Zilog. acordaron la dirección de cambio de sus chips UART y que MSB de un byte sería 2 ** 7 y LSB sería 2 ** 0 en sus CPU (utilicé la notación de potencia FORTRAN para enfatizar qué edad tienen estas cosas :)).
Me encontré con este problema con algunos datos del enlace descendente serial de Space Shuttle hace más de 20 años cuando reemplazamos un hardware de interfaz de $ 10K con una computadora Mac. Hay un resumen de la tecnología de la NASA publicado hace mucho tiempo. Simplemente utilicé una tabla de búsqueda de 256 elementos con los bits invertidos (tabla [0x01] = 0x80, etc.) después de que cada byte se desplazó desde la secuencia de bits.
No hay enteros sin signo en Java. Todos los enteros están firmados y en big endian.
En el lado C, cada byte tiene el LSB al comienzo está a la izquierda y el MSB al final.
Parece que está utilizando LSB como un bit menos significativo, ¿verdad? LSB generalmente representa byte menos significativo. Endianness no se basa en bits sino en bytes.
Para convertir de un byte sin signo a un entero de Java:
int i = (int) b & 0xFF;
Para convertir desde little-endian de 32 bits sin signo en byte [] a Java long (desde la parte superior de mi cabeza, no probado):
long l = (long)b[0] & 0xFF;
l += ((long)b[1] & 0xFF) << 8;
l += ((long)b[2] & 0xFF) << 16;
l += ((long)b[3] & 0xFF) << 24;
No hay forma de que esto pueda influir en nada en Java, ya que no hay forma (directa sin API) de asignar algunos bytes directamente a un int en Java.
Cada API que hace esto o algo similar define el comportamiento con bastante precisión, por lo que debe buscar la documentación de esa API.
Si se ajusta al protocolo que utiliza, considere usar un DataInputStream, donde el comportamiento está muy bien definido .
Utilice el orden de bytes de red (big endian), que es el mismo que utiliza Java de todos modos. Ver Htons para los diferentes traductores en C.