Maison > développement back-end > C++ > Comment implémenter une fonction portable de classement d'octets entiers de 64 bits en C ?

Comment implémenter une fonction portable de classement d'octets entiers de 64 bits en C ?

Mary-Kate Olsen
Libérer: 2024-11-01 01:33:28
original
412 Les gens l'ont consulté

How to Implement a Portable 64-Bit Integer Byte Ordering Function in C  ?

Fonction portable de classement d'octets entiers de 64 bits en C

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>
Copier après la connexion
  • La macro htonll convertit un entier de 64 bits x en ordre d'octets du réseau en échangeant Mots de 32 bits si l'architecture cible est little-endian.
  • ntohll effectue l'opération inverse, en passant de l'ordre des octets du réseau à l'ordre des octets natif.

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>
Copier après la connexion
  • Cette approche définit htonll et ntohll à l'aide de macros de préprocesseur basées sur les symboles de préprocesseur __BIG_ENDIAN__ ou __LITTLE_ENDIAN__ fournis par la plupart des compilateurs.
  • Si l'architecture est grande- endian (symbole défini), les fonctions renvoient simplement la valeur d'entrée puisqu'aucun échange d'octets n'est nécessaire.
  • Pour les architectures little-endian, les fonctions effectuent un échange d'octets comme dans l'exemple précédent.

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