En supposant que ce dont vous avez besoin est un simple échange d'octets, essayez quelque chose comme
Conversion 16 bits non signée :
swapped = (num>>8) | (num<<8);
Conversion de 32 bits non signés :
swapped = ((num>>24)&0xff) | // move byte 3 to byte 0
((num<<8)&0xff0000) | // move byte 1 to byte 2
((num>>8)&0xff00) | // move byte 2 to byte 1
((num<<24)&0xff000000); // byte 0 to byte 3
Cela permute les ordres d'octets des positions 1234 à 4321. Si votre entrée était 0xdeadbeef
un swap 32 bits endian pourrait avoir une sortie de 0xefbeadde
.
Le code ci-dessus devrait être nettoyé avec des macros ou au moins des constantes à la place des nombres magiques, mais j'espère qu'il sera utile tel quel.
EDIT : comme l'a souligné une autre réponse, il existe des alternatives spécifiques à la plate-forme, au système d'exploitation et au jeu d'instructions qui peuvent être BEAUCOUP plus rapides que les solutions ci-dessus. Dans le noyau Linux, il y a des macros (cpu_to_be32 par exemple) qui gèrent très bien l'endiannité. Mais ces alternatives sont spécifiques à leurs environnements. En pratique, la meilleure façon de gérer l'endiveté est d'utiliser un mélange des approches disponibles.
5 votes
Une valeur de 16 bits ? une valeur de 32 bits ? un flottant ? un tableau ?
25 votes
Le temps de choisir une réponse peut-être ?
9 votes
Vote pour la réouverture. Identique à stackoverflow.com/questions/105252/ pour C++. Nous pourrions juste éditer pour rendre cela plus clair.
0 votes
Je pense que c'est assez clair. Veuillez décacheter la question.
0 votes
Gcc et g++ détectent correctement de tels échanges et les convertissent en une ou deux instructions, mais vous devez probablement utiliser
-O3
ou au moins-O2
. Vous devez donc écrire une fonction simple pour faire l'échange avecinline
et il fera automatiquement le travail pour vous.