Java lire des entiers en little endian ou big endian?
Je demande parce que je suis l'envoi d'un flux d'octets à partir d'un C processus de Java. Sur le côté C l'entier de 32 bits a le LSB est le premier octet et le MSB est le 4ème octet.
Donc ma question est: Sur le Java côté quand on lit l'octet comme il a été envoyé à partir de la C processus, ce qui est endian sur le Java côté?
Une question de suivi: Si le endian sur le Java n'est pas le même que celui envoyé, comment puis-je convertir entre eux?
Vous devez vous connecter pour publier un commentaire.
Utiliser le réseau d'ordre des octets (big endian), qui est le même que Java utilise de toute façon. Voir l'homme htons pour les différents traducteurs en C.
Je suis tombé ici via Google et j'ai obtenu ma réponse que Java est en big endian.
De la lecture à travers les réponses que je tiens à souligner que les octets ont en effet un endian, même si heureusement, si vous n'avez traitées avec le "mainstream" des microprocesseurs vous êtes peu probable d'avoir jamais rencontré comme Intel, Motorola, et Zilog tous d'accord sur la direction du décalage de leurs puces UART et que MSB d'un octet sera de 2**7 et LSB serait de 2**0 dans leurs Processeurs (j'ai utilisé le FORTRAN pouvoir de notation de souligner à quel âge ce genre de choses est 🙂 ).
J'ai rencontré ce problème avec certains de la Navette Spatiale de bits série de liaison descendante de données de+ de 20 ans, lorsque nous avons remplacé un $10K hardware avec un ordinateur Mac. Il y a de la NASA Tech mémoire publié à ce sujet il y a longtemps. J'ai simplement utilisé un 256 élément de la table avec les bits inversés (tableau[0x01]=0x80 etc.) après chaque octet a été déplacé dans le flux de bits.
Il n'y a pas des entiers non signés en Java. Tous les nombres entiers sont signés et en big-endian.
Il semble que vous utilisez LSB comme bit le Moins significatif, êtes-vous? LSB habituellement signifie octet le moins significatif.
Endianness n'est pas peu, mais octet fonction.
Pour convertir à partir d'octet non signé pour un Java entier:
Pour convertir de non signé de 32 bits de poids faible octet[] pour Java de long (à partir du haut de ma tête, pas testé):
Il n'y a aucune influence sur quoi que ce soit dans Java, car il n'y a pas de direct non-API) pour cartographier les quelques octets directement dans un int en Java.
Chaque API qui fait cela ou quelque chose de similaire définit le comportement assez précisément, alors vous devriez consulter la documentation de l'API.
Je voudrais lire les octets un par un, et de les combiner dans un long valeur. De cette façon, vous contrôlez l'endianness, et le processus de communication est transparente.
S'il adapte le protocole que vous utilisez, pensez à utiliser un DataInputStream, où le comportement est très bien défini.
Java est "Big-endian" comme indiqué ci-dessus. Cela signifie que le bit de poids fort d'un entier est sur la gauche si vous examinez la mémoire (sur un PROCESSEUR Intel au moins). Le bit de signe est également à l'ESM pour tous Java les types d'entiers.
La lecture d'un 4 octets entier non signé à partir d'un fichier binaire stockée par un "Little-endian" système prend un peu de l'adaptation en Java. DataInputStream de readInt() s'attend à ce format Big-endian.
Voici un exemple qui lit un à quatre octets de valeur non signée (comme montré par HexEdit 01 00 00 00) en un entier ayant une valeur de 1: