Sobes.tech
Junior

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