O que você sabe sobre as notações Big Endian, Little Endian e Middle Endian?
sobes.tech IA
Resposta da IA
Big Endian: o byte mais significativo de um número multibyte é colocado no endereço de memória mais baixo, e o byte menos significativo no mais alto. Little Endian: o byte menos significativo de um número multibyte é colocado no endereço de memória mais baixo, e o mais significativo no mais alto. Middle Endian: não é uma notação amplamente aceita. Às vezes, refere-se a casos em que a ordem dos bytes difere de Big Endian e Little Endian, por exemplo, ao processar números multibyte em blocos de 2 bytes.
Exemplo para um número de 4 bytes 0x12345678:
| Endereço | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
A maioria dos processadores modernos (Intel, AMD) usam Little Endian. Protocolos de rede, geralmente, usam Big Endian (conhecido como "ordem de bytes de rede").
Para verificar a endianness do sistema, pode-se fazer assim:
#include <iostream>
int main() {
int x = 1;
// Criar um ponteiro para byte e verificar o primeiro byte do número 1 (0x00000001)
if (*reinterpret_cast<char*>(&x) == 1) {
std::cout << "Little Endian" << std::endl;
} else {
std::cout << "Big Endian" << std::endl;
}
return 0;
}
Para converter entre ordens de bytes em C++, usam-se funções dos cabeçalhos <arpa/inet.h> (para ordem de rede) ou <endian.h> (mais gerais).
#include <arpa/inet.h> // Para htons, htonl, ntohs, ntohl
int main() {
uint16_t host_short = 0x1234;
uint32_t host_long = 0x12345678;
// Converter de ordem de host para ordem de rede (Big Endian)
uint16_t network_short = htons(host_short);
uint32_t network_long = htonl(host_long);
// Converter de ordem de rede (Big Endian) para ordem de host
uint16_t back_to_host_short = ntohs(network_short);
uint32_t back_to_host_long = ntohl(network_long);
return 0;
}