Maison >développement back-end >C++ >Comment convertir des valeurs 64 bits entre l'ordre des octets du réseau et de l'hôte en C ?

Comment convertir des valeurs 64 bits entre l'ordre des octets du réseau et de l'hôte en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 04:42:30828parcourir

How to Convert 64-bit Values Between Network and Host Byte Order in C  ?

Extensionntohl() pour les valeurs 64 bits

La fonction C ntohl() est généralement utilisée pour convertir des valeurs 32 bits à partir du réseau ordre des octets pour héberger l'ordre des octets. Cependant, dans certains scénarios, une opération similaire peut être nécessaire pour les valeurs 64 bits.

Solution

Les pages de manuel de htonl() indiquent sa limitation à 32- les valeurs de bits, car le long non signé sur certaines plates-formes a une taille de 32 bits. Pour répondre au besoin de conversion 64 bits, plusieurs approches peuvent être explorées :

Bibliothèque standard :

  • htobe64() et be64toh()  : Ces fonctions sont disponibles sur Linux (glibc >= 2.9) et FreeBSD pour convertir des valeurs 64 bits entre big endian et little endian.

Suggestions d'implémentation :

  • Union avec unsigned long long et char[8] : Une union peut être utilisée pour échanger manuellement des octets si la plate-forme n'est pas big endian. Cependant, cette méthode n'est pas recommandée car elle repose sur des hypothèses dépendantes du système.

Preprocessor Magic :

  • En-têtes spécifiques à la plate-forme  : Le code de préprocesseur suivant permet la portabilité sur différentes plates-formes, notamment Linux, FreeBSD et OpenBSD :
<code class="cpp">#if defined(__linux__)
#  include <endian.h>
#elif defined(__FreeBSD__) || defined(__NetBSD__)
#  include <sys/endian.h>
#elif defined(__OpenBSD__)
#  include <sys/types.h>
#  define be16toh(x) betoh16(x)
#  define be32toh(x) betoh32(x)
#  define be64toh(x) betoh64(x)
#endif</code>

Exemple d'utilisation :

Grâce à la magie du préprocesseur, la conversion peut être effectuée à l'aide de l'extrait de code suivant :

<code class="cpp">  #include <stdint.h>

  uint64_t  host_int = 123;
  uint64_t  big_endian;

  big_endian = htobe64( host_int );
  host_int = be64toh( big_endian );</code>

Cette approche fournit une interface standard de type bibliothèque C qui est compatible sur plusieurs plates-formes.

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