Heim > Backend-Entwicklung > C++ > Hauptteil

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

Barbara Streisand
Freigeben: 2024-10-31 04:42:30
Original
739 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!