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
Mary-Kate Olsenoriginal
2024-11-01 01:33:28412parcourir

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>
  • 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>
  • 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!

Déclaration:
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