Sobes.tech
Junior

Co víte o notacích Big Endian, Little Endian a Middle Endian?

sobes.tech AI

Odpověď od AI

Big Endian: nejvýznamnější (nejdůležitější) bajt vícebajtového čísla je umístěn na nejnižší adrese paměti a nejméně významný bajt na nejvyšší. Little Endian: nejméně významný bajt vícebajtového čísla je umístěn na nejnižší adrese paměti a nejvýznamnější bajt na nejvyšší. Middle Endian: není široce přijímanou notací. Někdy označuje případy, kdy pořadí bajtů se liší od Big Endian a Little Endian, například při zpracování vícebajtových čísel v blocích po 2 bajty.

Příklad pro 4-bajtové číslo 0x12345678:

Adresa Big Endian Little Endian
0x1000 0x12 0x78
0x1001 0x34 0x56
0x1002 0x56 0x34
0x1003 0x78 0x12

Většina moderních procesorů (Intel, AMD) používá Little Endian. Sítě protokoly obvykle používají Big Endian (takzvaný "síťový pořádek bajtů").

Systém endianness lze zkontrolovat takto:

#include <iostream>

int main() {
    int x = 1;
    // Vytvoříme ukazatel na byte a podíváme se na první byte čísla 1 (0x00000001)
    if (*reinterpret_cast<char*>(&x) == 1) {
        std::cout << "Little Endian" << std::endl;
    } else {
        std::cout << "Big Endian" << std::endl;
    }
    return 0;
}

Pro převod mezi pořadím bajtů v C++ se používají funkce z hlaviček <arpa/inet.h> (pro síťové pořadí) nebo <endian.h> (obecnější).

#include <arpa/inet.h> // Pro htons, htonl, ntohs, ntohl

int main() {
    uint16_t host_short = 0x1234;
    uint32_t host_long = 0x12345678;

    // Převod z hostovského pořadí do síťového (Big Endian)
    uint16_t network_short = htons(host_short);
    uint32_t network_long = htonl(host_long);

    // Převod ze síť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;
}