Question :
Pouvons-nous obtenir une fonction standard comme htonl qui fonctionne avec des entiers de 64 bits en C, permettant la conversion dans l'ordre des octets du réseau ?
Réponse :
Bien qu'il n'y ait pas de fonction explicitement définie comme htonll en C bibliothèque standard, il est possible de créer une implémentation portable. Voici deux approches :
Utilisation de la détection d'endianité dynamique :
<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>
Utilisation des macros du préprocesseur :
<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>
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!