Ką žinote apie Big Endian, Little Endian ir Middle Endian notacijas?
sobes.tech AI
Atsakymas iš AI
Didelė pabaiga: didžiausias (svarbiausias) baitas daugiabaitiniame skaičiuje yra saugomas mažesnėje atminties adresėje, o mažiausias baitas — didesnėje. Mažoji pabaiga: mažiausias (svarbiausias) baitas daugiabaitiniame skaičiuje yra saugomas mažesnėje atminties adresėje, o didžiausias baitas — didesnėje. Vidurio pabaiga: nėra bendro priimto žymėjimo. Kartais ji suprantama kaip atvejai, kai baitų tvarka skiriasi nuo BigEndian ir LittleEndian, pavyzdžiui, kai daugiabaitiniai skaičiai apdorojami 2 baitų blokais.
Pavyzdys 4 baitų skaičiui 0x12345678:
| Adresas | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
Dauguma šiuolaikinių procesorių (Intel, AMD) naudoja Little Endian. Tinklo protokolai dažniausiai naudoja Big Endian (vadinamą "tinklo baitų tvarką").
Sistema endianness patikrinama taip:
#include <iostream>
int main() {
int x = 1;
// Sukuriamas baitų rodyklė ir žiūrima į pirmąjį skaičiaus baitą (0x00000001)
if (*reinterpret_cast<char*>(&x) == 1) {
std::cout << "Little Endian" << std::endl;
} else {
std::cout << "Big Endian" << std::endl;
}
return 0;
}
Baitų tvarkos keitimas C++ atliekamas naudojant funkcijas iš <arpa/inet.h> (tinklo tvarka) arba <endian.h> (bendresnės).
#include <arpa/inet.h> // For htons, htonl, ntohs, ntohl
int main() {
uint16_t host_short = 0x1234;
uint32_t host_long = 0x12345678;
// Konvertavimas iš host tvarkos į tinklo (Big Endian)
uint16_t network_short = htons(host_short);
uint32_t network_long = htonl(host_long);
// Konvertavimas iš tinklo (Big Endian) į host tvarką
uint16_t back_to_host_short = ntohs(network_short);
uint32_t back_to_host_long = ntohl(network_long);
return 0;
}