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) & 0xFFFFFFFF) << 32) | htonl((x) >> 32)) #define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 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!