Heim > Artikel > Backend-Entwicklung > Wie konvertiere ich 64-Bit-Ganzzahlen in die Netzwerkbytereihenfolge in C?
Einführung:
Viele Netzwerkprotokolle erfordern die Speicherung von 64 -Bit-Ganzzahlen in „Netzwerk-Byte-Reihenfolge“. Dies unterscheidet sich von der Host-Byte-Reihenfolge, was möglicherweise zu Kompatibilitätsproblemen führt. Glücklicherweise wird für 32-Bit-Ganzzahlen häufig die Funktion htonl zum Konvertieren in die Netzwerk-Byte-Reihenfolge verwendet. Entwickler suchen häufig nach einer analogen Funktion für 64-Bit-Ganzzahlen. In diesem Artikel wird die Verfügbarkeit einer solchen Funktion untersucht und eine Implementierung bereitgestellt, falls diese nicht verfügbar ist.
Vorhandensein einer Standardfunktion:
Leider gibt es keine standardmäßige htonll-Funktion die C-Standardbibliothek oder eine weit verbreitete tragbare Bibliothek Bibliothek.
Implementierung:
In Ermangelung einer Standardfunktion können wir unsere eigene tragbare Version implementieren. Hier sind zwei Ansätze:
1. Laufzeit-Byte-Swapping:
Dieser Ansatz bestimmt, ob Byte-Swapping erforderlich ist, indem die Endianness zur Laufzeit mit htonl(1) überprüft wird. Wenn ein Byte-Austausch erforderlich ist, tauschen wir die 32-Bit-Hälften der 64-Bit-Ganzzahl mit htonl aus. Der Code für diesen Ansatz lautet:
<code class="c++">#define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))</code>
2. Byte-Swapping zur Kompilierungszeit:
Wenn Sie Zugriff auf einen Compiler haben, der Präprozessormakros wie __BIG_ENDIAN__ definiert, können Sie diese verwenden, um den Byte-Swapping-Prozess zur Kompilierungszeit zu optimieren. Hier ist ein Beispiel:
<code class="c++">#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>
Schlussfolgerung:
Zusammenfassend lässt sich sagen, dass es in C keine Standard-Htonll-Funktion gibt. Wir haben jedoch portable Implementierungen bereitgestellt, die Endianness zur Laufzeit oder Kompilierungszeit bestimmen und so die Konvertierung von 64-Bit-Ganzzahlen in die Netzwerk-Byte-Reihenfolge ermöglichen.
Das obige ist der detaillierte Inhalt vonWie konvertiere ich 64-Bit-Ganzzahlen in die Netzwerkbytereihenfolge in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!