Čo viete o notáciách Big Endian, Little Endian a Middle Endian?
sobes.tech AI
Odpoveď od AI
Big Endian: najvýznamnejší (najdôležitejší) bajt viacbajtového čísla sa umiestňuje na najnižšiu adresu pamäte a najmenej významný bajt na najvyššiu. Little Endian: najmenej významný bajt viacbajtového čísla sa umiestňuje na najnižšiu adresu pamäte a najvýznamnejší bajt na najvyššiu. Middle Endian: nie je široko prijímaná notácia. Niekedy sa vzťahuje na prípady, keď poradie bajtov sa líši od Big Endian a Little Endian, napríklad pri spracovaní viacbajtových čísel v blokoch po 2 bajty.
Príklad pre 4-bajtové číslo 0x12345678:
| Adresa | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
Väčšina moderných procesorov (Intel, AMD) používa Little Endian. Sieťové protokoly, zvyčajne, používajú Big Endian (takzvaný "sieťový poriadok bajtov").
Kontrolu endianness systému môžete vykonať takto:
#include <iostream>
int main() {
int x = 1;
// Vytvoríme ukazovateľ na byte a skontrolujeme prvý bajt čísla 1 (0x00000001)
if (*reinterpret_cast<char*>(&x) == 1) {
std::cout << "Little Endian" << std::endl;
} else {
std::cout << "Big Endian" << std::endl;
}
return 0;
}
Na konverziu medzi poradím bajtov v C++ sa používajú funkcie z hlavičiek <arpa/inet.h> (pre sieťové poradie) alebo <endian.h> (viac všeobecne).
#include <arpa/inet.h> // Pre htons, htonl, ntohs, ntohl
int main() {
uint16_t host_short = 0x1234;
uint32_t host_long = 0x12345678;
// Konverzia z hostovského poradia do sieťového (Big Endian)
uint16_t network_short = htons(host_short);
uint32_t network_long = htonl(host_long);
// Konverzia zo sieťového (Big Endian) do hostovského
uint16_t back_to_host_short = ntohs(network_short);
uint32_t back_to_host_long = ntohl(network_long);
return 0;
}