Was wissen Sie über die Notationen Big Endian, Little Endian und Middle Endian?
sobes.tech KI
Antwort von AI
Big Endian: Das höchstwertige (größte) Byte einer Mehrbyte-Zahl wird an der niedrigsten Speicheradresse abgelegt, und das niedrigste Byte an der höchsten. Little Endian: Das niedrigste (bedeutendste) Byte einer Mehrbyte-Zahl wird an der niedrigsten Speicheradresse abgelegt, und das höchstwertige Byte an der höchsten. Middle Endian: ist keine allgemein anerkannte Notation. Man versteht darunter manchmal Fälle, in denen die Byte-Reihenfolge von Big Endian und Little Endian abweicht, z.B. bei der Verarbeitung von Mehrbyte-Zahlen in 2-Byte-Blöcken.
Beispiel für eine 4-Byte-Zahl 0x12345678:
| Adresse | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
Die meisten modernen Prozessoren (Intel, AMD) verwenden Little Endian. Netzwerkprotokolle verwenden in der Regel Big Endian (sogenannter "Netzwerk-Byte-Reihenfolge").
Um die Endianness des Systems zu überprüfen, kann man folgendes machen:
#include <iostream>
int main() {
int x = 1;
// Erstellen eines Zeigers auf ein Byte und Überprüfung des ersten Bytes der Zahl 1 (0x00000001)
if (*reinterpret_cast<char*>(&x) == 1) {
std::cout << "Little Endian" << std::endl;
} else {
std::cout << "Big Endian" << std::endl;
}
return 0;
}
Zum Konvertieren zwischen Byte-Reihenfolgen in C++ werden Funktionen aus <arpa/inet.h> (für Netzwerk-Byte-Reihenfolge) oder <endian.h> (allgemeiner) verwendet.
#include <arpa/inet.h> // Für htons, htonl, ntohs, ntohl
int main() {
uint16_t host_short = 0x1234;
uint32_t host_long = 0x12345678;
// Konvertierung von Host-Byte-Reihenfolge zu Netzwerk-Byte-Reihenfolge (Big Endian)
uint16_t network_short = htons(host_short);
uint32_t network_long = htonl(host_long);
// Konvertierung von Netzwerk-Byte-Reihenfolge zu Host-Byte-Reihenfolge
uint16_t back_to_host_short = ntohs(network_short);
uint32_t back_to_host_long = ntohl(network_long);
return 0;
}