¿Qué sabe sobre las notaciones Big Endian, Little Endian y Middle Endian?
sobes.tech AI
Respuesta de la IA
Big Endian: el byte más significativo de un número multibyte se coloca en la dirección de memoria más baja, y el byte menos significativo en la más alta. Little Endian: el byte menos significativo de un número multibyte se coloca en la dirección de memoria más baja, y el más significativo en la más alta. Middle Endian: no es una notación ampliamente aceptada. A veces se refiere a casos en los que el orden de los bytes difiere de Big Endian y Little Endian, por ejemplo, al procesar números multibyte en bloques de 2 bytes.
Ejemplo para un número de 4 bytes 0x12345678:
| Dirección | Big Endian | Little Endian |
|---|---|---|
| 0x1000 | 0x12 | 0x78 |
| 0x1001 | 0x34 | 0x56 |
| 0x1002 | 0x56 | 0x34 |
| 0x1003 | 0x78 | 0x12 |
La mayoría de los procesadores modernos (Intel, AMD) utilizan Little Endian. Los protocolos de red, por lo general, utilizan Big Endian (conocido como "orden de bytes de red").
Para verificar la endianness del sistema, se puede hacer así:
#include <iostream>
int main() {
int x = 1;
// Crear un puntero a byte y mirar el primer byte del 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 convertir entre órdenes de bytes en C++, se utilizan funciones de los encabezados <arpa/inet.h> (para orden de red) o <endian.h> (más generales).
#include <arpa/inet.h> // Para htons, htonl, ntohs, ntohl
int main() {
uint16_t host_short = 0x1234;
uint32_t host_long = 0x12345678;
// Convertir de orden de host a orden de red (Big Endian)
uint16_t network_short = htons(host_short);
uint32_t network_long = htonl(host_long);
// Convertir de orden de red (Big Endian) a orden de host
uint16_t back_to_host_short = ntohs(network_short);
uint32_t back_to_host_long = ntohl(network_long);
return 0;
}