Sobes.tech
Junior

Ce știți despre notațiile Big Endian, Little Endian și Middle Endian?

sobes.tech AI

Răspuns de la AI

Big Endian: cel mai semnificativ (cel mai valoros) octet al unui număr multioctet este plasat la adresa de memorie cea mai mică, iar octetul cel mai puțin semnificativ — la cea mai mare. Little Endian: octetul cel mai puțin semnificativ al unui număr multioctet este plasat la adresa de memorie cea mai mică, iar octetul cel mai semnificativ — la cea mai mare. Middle Endian: nu este o notație acceptată pe scară largă. Uneori, se referă la cazurile în care ordinea octeților diferă de Big Endian și Little Endian, de exemplu, în procesarea numerelor multioctet în blocuri de câte 2 octeți.

Exemplu pentru un număr de 4 octeți 0x12345678:

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

Majoritatea procesoarelor moderne (Intel, AMD) utilizează Little Endian. Protocoalele de rețea, în general, utilizează Big Endian (numit "ordinea de bytes de rețea").

Pentru a verifica endianness-ul sistemului, se poate face astfel:

#include <iostream>

int main() {
    int x = 1;
    // Creăm un pointer la byte și verificăm primul byte al numărului 1 (0x00000001)
    if (*reinterpret_cast<char*>(&x) == 1) {
        std::cout << "Little Endian" << std::endl;
    } else {
        std::cout << "Big Endian" << std::endl;
    }
    return 0;
}

Pentru conversia între ordini de bytes în C++, se folosesc funcții din anteturile <arpa/inet.h> (pentru ordinea de rețea) sau <endian.h> (mai generale).

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

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

    // Conversie din ordinea gazdă în ordinea de rețea (Big Endian)
    uint16_t network_short = htons(host_short);
    uint32_t network_long = htonl(host_long);

    // Conversie din ordinea de rețea în ordinea gazdă
    uint16_t back_to_host_short = ntohs(network_short);
    uint32_t back_to_host_long = ntohl(network_long);

    return 0;
}