Conversion de Little Endian à Big Endian
Tous,
Je pratique de problèmes de code en ligne. Je travaille actuellement sur un énoncé du problème Problèmes où nous avons besoin de convertir un format Big-Endian <-> little-endian. Mais je ne suis pas en mesure de prendre les mesures se référant à l'exemple donné que:
123456789 converts to 365779719
La logique que j'envisage est :
1 > Obtenir la valeur de l'entier (Depuis que je suis sur Windows x86, l'entrée est Little endian)
2 > Générer la représentation hexadécimale de la même chose.
3 > Inverse de la représentation et de générer le big endian valeur entière
Mais je suis évidemment manque quelque chose ici.
Quelqu'un peut-il svp me guider. Je suis le codage en Java 1.5
source d'informationauteur name_masked
Vous devez vous connecter pour publier un commentaire.
La chose que vous devez comprendre, c'est que endian swaps de traiter les octets qui représentent l'entier. Ainsi, le 4 octets numéro 27 ressemble
0x0000001B
. Pour convertir ce nombre, il doit aller à0x1B000000
... Avec votre exemple, la représentation hexadécimale de la 123456789 est0x075BCD15
qui doit aller à0x15CD5B07
ou sous forme décimale 365779719.La fonction Stacker posté est l'évolution de ces octets par le décalage de bits; plus précisément, la déclaration
i&0xff
prend la plus bas octet dei
le<< 24
puis déplace jusqu'à 24 bits, donc, à partir de positions 1 à 8 de 25-32. Ainsi de suite à travers chaque partie de l'expression.Par exemple, le code, jetez un oeil à cette utilitaire.
Vérifier cela
Étant donné qu'une grande partie de l'écriture de logiciel à propos de la réutilisation de l'existant, la première chose que devrait toujours être un coup d'oeil dans la documentation de votre langue/bibliothèque.
Je ne sais pas quelle est l'efficacité de cette fonction, mais pour le basculement de beaucoup de chiffres, un
ByteBuffer
devrait offrir des performances décentes.Comme eversor souligné dans les commentaires,
ByteBuffer.putInt()
est une méthode facultative, et peuvent ne pas être disponibles sur toutes les implémentations Java.L'Approche de DIY
Bac de réception de la réponse est assez soigné, mais il est possible de l'améliorer.
Nous pouvons nous débarrasser des parenthèses en adaptant les masques de bits. E. g.,
(a & 0xFF)<<8
est équivalent àa<<8 & 0xFF00
. Le plus à droite des parenthèses n'ont pas été nécessaire de toute façon.Depuis la maj gauche déplace à zéro bits, le premier masque est redondante. Nous pouvons nous débarrasser de la plus à droite du masque à l'aide de la logique opérateur de décalage, qui se déplace en seulement zéro bits.
La priorité de l'opérateur ici, les détails sur les opérateurs de décalage sont dans le Java Langage De Spécification
la méthode suivante inverse l'ordre des bits dans un octet de valeur:
Je pense que cela peut également vous aider:
Primitif Java classes wrapper soutien octet inverser depuis 1.5 l'utilisation de
reverseBytes
méthode.Juste une contribution pour ceux qui sont à la recherche de cette réponse en 2018.