Lo pregunto porque estoy enviando un flujo de bytes desde 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 cuarto 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?
java
endianness
hhafez
fuente
fuente
Respuestas:
Utilice el orden de bytes de la red (big endian), que es el mismo que utiliza Java de todos modos. Vea man htons para los diferentes traductores en C.
fuente
Encontré aquí a través de Google y obtuve mi respuesta de que Java es big endian .
Al leer las respuestas, me gustaría señalar que los bytes tienen un orden endian, aunque afortunadamente, si solo ha tratado con microprocesadores "convencionales", es poco probable que lo haya encontrado alguna vez como Intel, Motorola y Zilog. acordó la dirección de cambio de sus chips UART y que MSB de un byte sería
2**7
y LSB estaría2**0
en sus CPU (usé la notación de potencia FORTRAN para enfatizar la antigüedad de estas cosas :)).Me encontré con este problema con algunos datos de enlace descendente en serie de bits del transbordador espacial hace más de 20 años cuando reemplazamos un hardware de interfaz de $ 10K con una computadora Mac. Hay un informe técnico de la NASA publicado al respecto hace mucho tiempo. Simplemente utilicé una tabla de búsqueda de 256 elementos con los bits invertidos (
table[0x01]=0x80
etc.) después de que cada byte se cambiara del flujo de bits.fuente
No hay enteros sin firmar en Java. Todos los números enteros están firmados y en big endian.
Parece que estás usando LSB como el bit menos significativo, ¿verdad? LSB generalmente significa byte menos significativo. Endianness no se basa en bits sino en bytes.
Para convertir de un byte sin firmar a un entero de Java:
Para convertir de little-endian de 32 bits sin firmar en byte [] a Java long (desde la parte superior de mi cabeza, no probado):
fuente
No hay forma de que esto pueda influir en nada en Java, ya que no hay una forma (directa sin API) de mapear algunos bytes directamente en 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.
fuente
Leería los bytes uno por uno y los combinaría en un valor largo . De esa forma controlas la endianidad y el proceso de comunicación es transparente.
fuente
Si se ajusta al protocolo que usa, considere usar un DataInputStream, donde el comportamiento está muy bien definido .
fuente
Java es 'Big-endian' como se señaló anteriormente. Eso significa que el MSB de un int está a la izquierda si examina la memoria (en una CPU Intel al menos). El bit de signo también está en el MSB para todos los tipos de enteros de Java.
Leer un entero sin signo de 4 bytes de un archivo binario almacenado por un sistema 'Little-endian' requiere un poco de adaptación en Java. ReadInt () de DataInputStream espera el formato Big-endian.
Aquí hay un ejemplo que lee un valor sin signo de cuatro bytes (como lo muestra HexEdit como 01 00 00 00) en un número entero con un valor de 1:
fuente
java force de hecho big endian: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.11
fuente
byte[] bbb = ByteBuffer.allocate(4).putFloat(0.42f).array();
produjo unbyte
matriz que es la inversa de lo queC/C++
produjo mi . Por lo tanto, el gran endianness de Java tiene efecto incluso en los datos en tiempo de ejecución.