Sobes.tech
Junior

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;
}