Heim  >  Artikel  >  Backend-Entwicklung  >  Wie konvertiere ich 64-Bit-Ganzzahlen in die Netzwerkbytereihenfolge in C?

Wie konvertiere ich 64-Bit-Ganzzahlen in die Netzwerkbytereihenfolge in C?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-31 16:09:01701Durchsuche

How to Convert 64-bit Integers to Network Byte Order in C  ?

htonl für 64-Bit-Ganzzahlen in C: Ein umfassender Leitfaden

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) &amp; 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) &amp; 0xFFFFFFFF) << 32) | htonl((x) >> 32))
# define ntohll(x) (((uint64_t)ntohl((x) &amp; 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!

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