Maison > développement back-end > C++ > Comment convertir des entiers 64 bits en ordre d'octets réseau en C ?

Comment convertir des entiers 64 bits en ordre d'octets réseau en C ?

Mary-Kate Olsen
Libérer: 2024-10-31 16:09:01
original
793 Les gens l'ont consulté

How to Convert 64-bit Integers to Network Byte Order in C  ?

htonl pour les entiers 64 bits en C : un guide complet

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) &amp; 0xFFFFFFFF) << 32) | htonl((x) >> 32))</code>
Copier après la connexion

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) &amp; 0xFFFFFFFF) << 32) | htonl((x) >> 32))
# define ntohll(x) (((uint64_t)ntohl((x) &amp; 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
#endif</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal