Question

J'ai une longue spéciale non signée (32 bits) et j'ai besoin de convertir son sens final, bit par bit. Mon long représente plusieurs choses rassemblées dans un seul fichier binaire.

Comment puis-je le faire?

Était-ce utile?

La solution

L'endianisme est un concept au niveau du mot où les octets sont stockés soit l'octet le plus significatif en premier (big endian) ou l'octet le moins significatif en premier (little endian). Les données transférées sur un réseau sont généralement du type big endian (ordre des octets du réseau). Les données stockées en mémoire sur une machine peuvent être dans l'un ou l'autre ordre, le plus petit étant le plus commun étant donné la prévalence de l'architecture Intel x86. Même si la plupart des architectures informatiques sont big endian, le x86 est tellement omniprésent que vous verrez le plus souvent peu de données endian en mémoire.

Quoi qu’il en soit, le but de tout cela est que l’endianisme est un concept très spécifique qui ne s’applique qu’au niveau octet, pas au niveau bit. Si ntohs () , ntohl () , htons () et htonl () ne font pas quoi vous voulez alors ce que vous avez à faire n'est pas endianness en soi.

Si vous devez inverser les éléments individuels de votre signe long non signé ou faire quelque chose de compliqué comme celui-ci, publiez plus d'informations sur ce que vous devez faire exactement.

Autres conseils

Veillez à bien comprendre le sens du mot "endianness". Il fait référence à l'ordre des octets dans les données, pas aux bits dans l'octet. Vous devrez peut-être uniquement utiliser une fonction telle que htonl ou ntohl pour convertir votre mot-d.

Si vous voulez vraiment inverser l'ordre de tous les bits du type de données 32b, vous pouvez écrire un algorithme itératif à masquer et décaler chaque bit dans la position réfléchie appropriée.

Une simple fonction de conversion sans fin pour une valeur longue non signée pourrait ressembler à ceci:

typedef union {
  unsigned long u32;
  unsigned char u8 [ 4 ];
} U32_U8;

unsigned long SwapEndian(unsigned long u)
{
   U32_U8 source;
   U32_U8 dest;

   source.u32 = u;
   dest.u8[0] = source.u8[3];
   dest.u8[1] = source.u8[2];
   dest.u8[2] = source.u8[1];
   dest.u8[3] = source.u8[0];

   return dest.u32;
}

Pour inverser l'ordre des bits d'un entier, vous pouvez décaler les bits dans un sens et décaler les bits vers la destination dans le sens opposé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top