Maison > Article > développement back-end > Comment convertir des entiers 64 bits en ordre d’octets réseau en C ?
Introduction :
De nombreux protocoles réseau nécessitent de stocker 64 -des entiers de bits dans "l'ordre des octets du réseau". Cela diffère de l'ordre des octets de l'hôte, ce qui peut entraîner des problèmes de compatibilité. Heureusement, pour les entiers 32 bits, la fonction htonl est largement utilisée pour la conversion dans l'ordre des octets du réseau. Les développeurs recherchent souvent une fonction analogue pour les entiers 64 bits. Cet article explore la disponibilité d'une telle fonction et propose une implémentation si elle n'est pas disponible.
Existence d'une fonction standard :
Malheureusement, il n'existe pas de fonction htonll standard dans la bibliothèque standard C ou toute bibliothèque portable largement adoptée.
Implémentation :
En l'absence de fonction standard, nous pouvons implémenter notre propre version portable. Voici deux approches :
1. Échange d'octets à l'exécution :
Cette approche détermine si l'échange d'octets est nécessaire en vérifiant le caractère boutiste au moment de l'exécution à l'aide de htonl(1). Si un échange d'octets est nécessaire, nous échangeons les moitiés 32 bits de l'entier 64 bits en utilisant htonl. Le code de cette approche est :
<code class="c++">#define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))</code>
2. Échange d'octets au moment de la compilation :
Si vous avez accès à un compilateur qui définit des macros de préprocesseur comme __BIG_ENDIAN__, vous pouvez les utiliser pour optimiser le processus d'échange d'octets au moment de la compilation. Voici un exemple :
<code class="c++">#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>
Conclusion :
En conclusion, il n'existe pas de fonction htonll standard en C . Cependant, nous avons fourni des implémentations portables qui déterminent le caractère boutiste au moment de l'exécution ou de la compilation, permettant la conversion d'entiers de 64 bits dans l'ordre des octets du réseau.
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!