Heim > Artikel > Backend-Entwicklung > Wie implementiert man eine 64-Bit-htonll-Funktion 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) & 0xFFFFFFFF) << 32) | htonl((x) >> 32)) #define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 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!