Je demande parce que j'envoie un flux d'octets d'un processus C à Java. Du côté C, l'entier de 32 bits a le LSB est le premier octet et MSB est le 4ème octet.
Ma question est donc la suivante: du côté Java, lorsque nous lisons l'octet tel qu'il a été envoyé par le processus C, qu'est-ce qu'endian du côté Java?
Une question de suivi: si l'endian du côté Java n'est pas le même que celui envoyé, comment puis-je convertir entre eux?
java
endianness
Hhafez
la source
la source
Réponses:
Utilisez l'ordre des octets du réseau (big endian), qui est le même que celui que Java utilise de toute façon. Voir man htons pour les différents traducteurs en C.
la source
Je suis tombé ici via Google et j'ai obtenu ma réponse que Java est un gros boutiste .
En lisant les réponses, je voudrais souligner que les octets ont en effet un ordre endian, bien que heureusement, si vous n'avez traité que de microprocesseurs «grand public», il est peu probable que vous les ayez jamais rencontrés comme Intel, Motorola et Zilog tous ont convenu de la direction de décalage de leurs puces UART et que MSB d'un octet serait
2**7
et LSB serait2**0
dans leurs processeurs (j'ai utilisé la notation de puissance FORTRAN pour souligner l'âge de ce truc :)).J'ai rencontré ce problème avec des données de liaison descendante série de bits de la navette spatiale il y a plus de 20 ans lorsque nous avons remplacé un matériel d'interface de 10 000 $ par un ordinateur Mac. Un mémoire technique de la NASA a été publié à ce sujet il y a longtemps. J'ai simplement utilisé une table de recherche de 256 éléments avec les bits inversés (
table[0x01]=0x80
etc.) après que chaque octet a été décalé du flux de bits.la source
Il n'y a pas d'entiers non signés en Java. Tous les entiers sont signés et en big endian.
On dirait que vous utilisez LSB comme bit le moins significatif, n'est-ce pas? LSB représente généralement l'octet le moins significatif. L'endianness n'est pas basée sur les bits mais sur les octets.
Pour convertir un octet non signé en un entier Java:
Pour convertir un petit-boutiste 32 bits non signé en octet [] en Java long (du haut de ma tête, non testé):
la source
Il n'y a aucun moyen que cela puisse influencer quoi que ce soit en Java, car il n'y a pas de moyen (direct non-API) de mapper certains octets directement dans un int en Java.
Chaque API qui fait ceci ou quelque chose de similaire définit le comportement assez précisément, vous devriez donc consulter la documentation de cette API.
la source
Je lirais les octets un par un et les combinerais en une longue valeur. De cette façon, vous contrôlez l'endianness et le processus de communication est transparent.
la source
S'il correspond au protocole que vous utilisez, envisagez d'utiliser un DataInputStream, où le comportement est très bien défini .
la source
Java est 'Big-endian' comme indiqué ci-dessus. Cela signifie que le MSB d'un int est sur la gauche si vous examinez la mémoire (sur un processeur Intel au moins). Le bit de signe est également dans le MSB pour tous les types d'entiers Java.
La lecture d'un entier non signé de 4 octets à partir d'un fichier binaire stocké par un système 'Little-endian' demande un peu d'adaptation en Java. ReadInt () de DataInputStream attend le format Big-endian.
Voici un exemple qui lit une valeur non signée de quatre octets (telle qu'affichée par HexEdit sous la forme 01 00 00 00) dans un entier avec une valeur de 1:
la source
java force en effet big endian: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.11
la source
byte[] bbb = ByteBuffer.allocate(4).putFloat(0.42f).array();
produit unbyte
tableau qui est l'inverse de ce que j'aiC/C++
produit. Par conséquent, la grande finalité de Java prend effet même dans les données au moment de l'exécution.