Heim > Artikel > Backend-Entwicklung > Wie konvertiere ich 64-Bit-Ganzzahlen in C über ntohl() hinaus?
64-Bit-Ganzzahlkonvertierung in C: Jenseits von ntohl()
Die Funktion htonl() ist, wie in der Dokumentation vorgeschlagen, begrenzt in 32-Bit-Integer-Konvertierung. In Situationen, in denen Sie jedoch eine 64-Bit-Konvertierung benötigen, stehen mehrere Optionen zur Verfügung.
Standardbibliotheksfunktionen
Für Linux (glibc >= 2.9) und FreeBSD Mit der Funktion htobe64() können 64-Bit-Ganzzahlen von Big Endian in Little Endian konvertiert werden. Diese Funktion ist Teil der Standard-C-Bibliothek.
Union-basierter Ansatz
Alternativ können Sie eine Union verwenden, um zwischen 64-Bit-Ganzzahlen und 8-Byte-Ganzzahlen zu konvertieren Zeichenarrays. Bei diesem Ansatz werden die Bytes für Big-Endian-Plattformen manuell ausgetauscht.
Präprozessormakros
Um plattformspezifische Unterschiede auszublenden und einen einheitlichen Ansatz bereitzustellen, können Sie Folgendes verwenden Präprozessorcode:
<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>
Dieser Code stellt Makros im Linux/FreeBSD-Stil unter Linux, OpenBSD, FreeBSD und NetBSD bereit.
Beispielverwendung
Um die Verwendung des empfohlenen Ansatzes zu demonstrieren, betrachten Sie den folgenden Code:
<code class="cpp">#include <stdint.h> // For 'uint64_t' int main() { uint64_t host_int = 123; uint64_t big_endian; big_endian = htobe64(host_int); host_int = be64toh(big_endian); return 0; }</code>
Dieser Code konvertiert eine 64-Bit-Ganzzahl, host_int, von Little Endian in Big Endian und zurück, wobei ihr Wert effektiv erhalten bleibt.
Das obige ist der detaillierte Inhalt vonWie konvertiere ich 64-Bit-Ganzzahlen in C über ntohl() hinaus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!