Heim  >  Artikel  >  Backend-Entwicklung  >  Wie implementiert man eine 64-Bit-htonll-Funktion in C?

Wie implementiert man eine 64-Bit-htonll-Funktion in C?

DDD
DDDOriginal
2024-10-31 04:21:45486Durchsuche

How to Implement a 64-Bit htonll Function in C  ?

Suche nach einer „Standard“-64-Bit-htonl-Funktion in C

In C wird die htonl-Funktion verwendet, um eine 32-Bit-htonl-Funktion zu konvertieren. Bit-Ganzzahl von der Host-Byte-Reihenfolge zur Netzwerk-Byte-Reihenfolge. Allerdings ist für 64-Bit-Ganzzahlen derzeit keine „Standard“-htonll-Funktion in der Sprache verfügbar.

Portable Implementierung von htonll

Um diesem Bedarf gerecht zu werden, müssen Programmierer haben portable Implementierungen von htonll entwickelt, um die Konvertierung der 64-Bit-Integer-Byte-Reihenfolge auf verschiedenen Plattformen, einschließlich Windows, Linux und AIX, zu bewältigen. Eine solche Implementierung ist:

<code class="cpp">#define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) &amp; 0xFFFFFFFF) << 32) | htonl((x) >> 32))
#define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) &amp; 0xFFFFFFFF) << 32) | ntohl((x) >> 32))</code>

Diese Implementierung verwendet die htonl-Funktion für die 32-Bit-Konvertierung und wendet sie zweimal an, einmal für jede 32-Bit-Hälfte der 64-Bit-Ganzzahl, und stellt gleichzeitig den Austausch sicher Teile sind in der richtigen Reihenfolge.

Bestimmen der Endianness

Da C keine portable Möglichkeit zur Bestimmung der Endianness zur Kompilierungszeit fehlt, überprüft die obige Implementierung sie zur Laufzeit durch Aufruf htonl für die Ganzzahl 1. Wenn das Ergebnis gleich 1 ist, handelt es sich um ein Little-Endian-System und es ist kein Byte-Swapping erforderlich. Andernfalls ist es Big-Endian und die Implementierung vertauscht die Bytes.

Alternative mit Compiler-Direktiven

Eine andere portable Implementierung verwendet Compiler-Direktiven, um zwischen Big-Endian und zu unterscheiden Little-Endian-Architekturen:

<code class="cpp">#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>

Diese Implementierung definiert htonll- und ntohll-Funktionen basierend auf der BIG_ENDIAN-Direktive, die von den meisten Compilern und Betriebssystemen unterstützt wird.

Das obige ist der detaillierte Inhalt vonWie implementiert man eine 64-Bit-htonll-Funktion 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