Maison  >  Article  >  développement back-end  >  Comment implémenter une fonction htonll 64 bits en C ?

Comment implémenter une fonction htonll 64 bits en C ?

DDD
DDDoriginal
2024-10-31 04:21:45486parcourir

How to Implement a 64-Bit htonll Function in C  ?

Recherche d'une fonction htonl 64 bits "standard" en C

En C, la fonction htonl est utilisée pour convertir un 32- nombre entier de bits allant de l'ordre des octets de l'hôte à l'ordre des octets du réseau. Cependant, pour les entiers 64 bits, il n'existe actuellement aucune fonction htonll « standard » disponible dans le langage.

Implémentation portable de htonll

Pour répondre à ce besoin, les programmeurs ont conçu des implémentations portables de htonll pour gérer la conversion de l'ordre des octets entiers de 64 bits sur différentes plates-formes, notamment Windows, Linux et AIX. Une de ces implémentations est :

<code class="cpp">#define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) &amp; 0xFFFFFFFF) << 32) | htonl((x) >> 32))
#define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) &amp; 0xFFFFFFFF) << 32) | ntohl((x) >> 32))</code>

Cette implémentation utilise la fonction htonl pour la conversion 32 bits et l'applique deux fois, une fois pour chaque moitié 32 bits de l'entier 64 bits, tout en garantissant également l'échange les parties sont dans le bon ordre.

Détermination de l'endianité

Comme C ne dispose pas d'un moyen portable pour déterminer l'endianité au moment de la compilation, l'implémentation ci-dessus la vérifie au moment de l'exécution en appelant htonl sur l'entier 1. Si le résultat est égal à 1, le système est petit-boutiste et aucun échange d'octets n'est nécessaire. Sinon, c'est du big-endian et l'implémentation échange les octets.

Utilisation alternative des directives du compilateur

Une autre implémentation portable utilise les directives du compilateur pour différencier le big-endian et Architectures little-endian :

<code class="cpp">#if __BIG_ENDIAN__
# define htonll(x) (x)
# define ntohll(x) (x)
#else
# define htonll(x) (((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
# define ntohll(x) (((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
#endif</code>

Cette implémentation définit les fonctions htonll et ntohll basées sur la directive BIG_ENDIAN, qui est prise en charge par la plupart des compilateurs et des systèmes d'exploitation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn