Sobes.tech
Junior

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