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