Heim >Backend-Entwicklung >C++ >Wie konvertiere ich 64-Bit-Werte zwischen Netzwerk- und Host-Bytereihenfolge in C?

Wie konvertiere ich 64-Bit-Werte zwischen Netzwerk- und Host-Bytereihenfolge in C?

Barbara Streisand
Barbara StreisandOriginal
2024-10-31 04:42:30833Durchsuche

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

ntohl()-Erweiterung für 64-Bit-Werte

Die C-Funktion ntohl() wird normalerweise zum Konvertieren von 32-Bit-Werten aus dem Netzwerk verwendet Byte-Reihenfolge zur Host-Byte-Reihenfolge. In bestimmten Szenarien ist jedoch möglicherweise ein ähnlicher Vorgang für 64-Bit-Werte erforderlich.

Lösung

Die Manpages für htonl() weisen auf die Beschränkung auf 32-Bit-Werte hin. Bitwerte, da unsigned long auf bestimmten Plattformen 32 Bit groß ist. Um den Bedarf an 64-Bit-Konvertierung zu decken, können mehrere Ansätze untersucht werden:

Standardbibliothek:

  • htobe64() und be64toh() : Diese Funktionen sind unter Linux (glibc >= 2.9) und FreeBSD zum Konvertieren von 64-Bit-Werten zwischen Big Endian und Little Endian verfügbar.

Implementierungsvorschläge:

  • Union mit unsigned long long und char[8]: Eine Union kann zum manuellen Austauschen von Bytes verwendet werden, wenn die Plattform nicht Big Endian ist. Diese Methode wird jedoch nicht empfohlen, da sie auf systemabhängigen Annahmen beruht.

Präprozessor-Magie:

  • Plattformspezifische Header : Der folgende Präprozessorcode ermöglicht die Portabilität über verschiedene Plattformen hinweg, einschließlich Linux, FreeBSD und 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>

Verwendungsbeispiel:

Mithilfe der Präprozessor-Magie kann die Konvertierung mithilfe des folgenden Codeausschnitts durchgeführt werden:

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

Dieser Ansatz stellt eine Standard-C-Bibliothek-ähnliche Schnittstelle bereit, die über mehrere Plattformen hinweg kompatibel ist.

Das obige ist der detaillierte Inhalt vonWie konvertiere ich 64-Bit-Werte zwischen Netzwerk- und Host-Bytereihenfolge in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn