Qué es la endianness
Un número de varios bytes tiene que guardarse byte a byte, y hay dos órdenes razonables para hacerlo. Big-endian pone el byte más significativo en la dirección más baja, como escribimos los números: 0x12345678 se convierte en 12 34 56 78. Little-endian pone primero el byte menos significativo: 78 56 34 12. x86, x86-64 y (por defecto) ARM son little-endian; los protocolos de red (IP, TCP, DNS), los archivos de clase de Java, PNG y la mayoría de los formatos de mainframe son big-endian, por eso «orden de bytes de red» significa big-endian.
Cuándo importa
Dentro de un programa en una máquina, nunca: la CPU se encarga. Importa en cuanto los bytes cruzan una frontera: escribir un struct en un archivo, leer un paquete, hablar con un sensor por SPI, mapear un formato de archivo binario o interpretar un volcado hex. Leer 78 56 34 12 en un volcado de memoria x86 y tomarlo por 0x78563412 es el error clásico.
Las funciones
| Lenguaje | Host → red (big-endian) | Intercambio arbitrario |
|---|---|---|
| C | htonl, htons, htobe64 | __builtin_bswap32 |
| Go | binary.BigEndian.PutUint32 | bits.ReverseBytes32 |
| Python | struct.pack('>I', x) | x.to_bytes(4, 'little') |
| Rust | x.to_be_bytes() | x.swap_bytes() |
| JavaScript | DataView.setUint32(o, x) | DataView con littleEndian=true |
UTF-16 y la BOM
El texto en UTF-16 tiene el mismo problema, por eso los archivos pueden empezar con una marca de orden de bytes: FE FF para big-endian, FF FE para little-endian. UTF-8 no tiene orden de bytes y no necesita BOM.
Preguntas
¿Qué endianness usa mi ordenador?
Casi seguro little-endian: todas las CPU x86 y x86-64 lo son, y ARM (teléfonos, Apple Silicon, Raspberry Pi) funciona en little-endian en la práctica. Big-endian sobrevive en los protocolos de red y en algunos sistemas embebidos y mainframes (s390x, PowerPC antiguos, SPARC).
¿Por qué la red es big-endian?
Convención histórica del primer ARPANET y de las máquinas IBM/Motorola, fijada en el RFC 1700. Todos los protocolos posteriores la siguen, por eso cada API de sockets tiene htons/htonl.
¿La endianness afecta a los bits dentro de un byte?
No. Un byte se lee siempre como un todo. El orden de los bits solo importa en protocolos serie y en algunos algoritmos CRC, y es una cuestión aparte.
¿Cómo detecto la endianness en tiempo de ejecución?
Escribe un 1 en un entero de 32 bits y mira el primer byte: 1 significa little-endian. En la práctica es mejor usar funciones de conversión explícitas para que el código funcione en todas partes.
¿Qué es middle-endian?
El PDP-11 guardaba los valores de 32 bits como dos mitades little-endian de 16 bits en orden big-endian (34 12 78 56). Está extinto, pero el término se sigue usando para formatos de fecha como MM-DD-YYYY.