Co wiesz o notacjach Big Endian, Little Endian i Middle Endian?
sobes.tech AI
Odpowiedź od AI
Big Endian: najbardziej znaczący (najstarszy) bajt liczby wielobajtowej umieszczany jest pod najniższym adresem pamięci, a najmniej znaczący bajt — pod najwyższym. Little Endian: najmniej znaczący bajt liczby wielobajtowej umieszczany jest pod najniższym adresem pamięci, a najbardziej znaczący — pod najwyższym. Middle Endian: nie jest to powszechnie przyjęta notacja. Czasami rozumie się przez nią przypadki, gdy kolejność bajtów różni się od Big Endian i Little Endian, na przykład podczas przetwarzania liczb wielobajtowych w blokach po 2 bajty.
Przykład dla 4-bajtowej liczby 0x12345678:
| Adres | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
Większość nowoczesnych procesorów (Intel, AMD) używa Little Endian. Protokoły sieciowe, z reguły, używają Big Endian (zwany "kolejnością bajtów sieci").
Sprawdzanie endianness systemu można wykonać tak:
#include <iostream>
int main() {
int x = 1;
// Tworzymy wskaźnik na bajt i sprawdzamy pierwszy bajt liczby 1 (0x00000001)
if (*reinterpret_cast<char*>(&x) == 1) {
std::cout << "Little Endian" << std::endl;
} else {
std::cout << "Big Endian" << std::endl;
}
return 0;
}
Konwersję między kolejnościami bajtów w C++ można wykonać za pomocą funkcji z nagłówków <arpa/inet.h> (dla kolejności sieciowej) lub <endian.h> (bardziej ogólne).
#include <arpa/inet.h> // Do htons, htonl, ntohs, ntohl
int main() {
uint16_t host_short = 0x1234;
uint32_t host_long = 0x12345678;
// Konwersja z kolejności hosta do kolejności sieci (Big Endian)
uint16_t network_short = htons(host_short);
uint32_t network_long = htonl(host_long);
// Konwersja z kolejności sieci (Big Endian) do kolejności hosta
uint16_t back_to_host_short = ntohs(network_short);
uint32_t back_to_host_long = ntohl(network_long);
return 0;
}