Heim  >  Artikel  >  Backend-Entwicklung  >  Wie implementiert man eine tragbare 64-Bit-Integer-Byte-Reihenfolgefunktion in C?

Wie implementiert man eine tragbare 64-Bit-Integer-Byte-Reihenfolgefunktion in C?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 01:33:28324Durchsuche

How to Implement a Portable 64-Bit Integer Byte Ordering Function in C  ?

Portable 64-Bit-Integer-Byte-Reihenfolgefunktion in C

Frage:

Können wir eine Standardfunktion wie htonl erhalten? das mit 64-Bit-Ganzzahlen in C funktioniert und die Konvertierung in die Netzwerk-Byte-Reihenfolge ermöglicht?

Antwort:

Während es in C keine explizit definierte Funktion wie htonll gibt Standardbibliothek ist es möglich, eine portable Implementierung zu erstellen. Hier sind zwei Ansätze:

Verwendung der dynamischen Endianness-Erkennung:

<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>
  • Das Makro htonll wandelt eine 64-Bit-Ganzzahl x durch Vertauschen in die Netzwerk-Byte-Reihenfolge um 32-Bit-Wörter, wenn die Zielarchitektur Little-Endian ist.
  • ntohll führt den umgekehrten Vorgang durch und konvertiert von der Netzwerk-Byte-Reihenfolge in die native Byte-Reihenfolge.

Verwendung von Präprozessor-Makros :

<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>
  • Dieser Ansatz definiert htonll und ntohll mithilfe von Präprozessormakros, die auf den Präprozessorsymbolen __BIG_ENDIAN__ oder __LITTLE_ENDIAN__ basieren, die von den meisten Compilern bereitgestellt werden.
  • Wenn die Architektur groß ist- Endian (Symbol definiert) geben die Funktionen einfach den Eingabewert zurück, da kein Byte-Austausch erforderlich ist.
  • Bei Little-Endian-Architekturen führen die Funktionen den Byte-Austausch wie im vorherigen Beispiel durch.

Das obige ist der detaillierte Inhalt vonWie implementiert man eine tragbare 64-Bit-Integer-Byte-Reihenfolgefunktion 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