Debajo de cualquier archivo de texto, imagen, paquete de red o programa en ejecución solo existe una abstracción física: secuencias de bits almacenadas en celdas de memoria o transmitidas como señales eléctricas y ópticas.
Entender cómo se agrupan esos bits en bytes y cómo se representan en hexadecimal elimina gran parte del misterio al depurar programas, analizar tráfico de red o leer direcciones de memoria.
§ Del bit al byte
Un bit (binary digit) es la unidad mínima de información y solo puede tomar dos estados: 0 o 1. Como un bit aislado permite representar muy poco, la arquitectura moderna organiza la memoria en bloques direccionables de 8 bits, llamados bytes (u octetos).
Con $8\text{ bits}$ podemos formar $2^8 = 256$ combinaciones distintas:
- Como entero sin signo (
uint8): valores desde0hasta255. - Como entero con signo en complemento a dos (
int8): valores desde-128hasta127. - Como carácter ASCII / UTF-8 de un byte: letras, dígitos y símbolos de control.
§ Por qué usamos hexadecimal (`0x`)
Leer o escribir cadenas de 32 o 64 bits en binario resulta propenso a errores humanos. El sistema hexadecimal (base 16, dígitos 0-9 y A-F) encaja de forma exacta con el binario porque cada dígito hexadecimal representa exactamente 4 bits (un nibble):
Carácter ASCII: 'A' (65 en decimal)
┌─────────────────┬─────────────────┐
Binario (8 bits): │ 0 1 0 0 │ 0 0 0 1 │
└────────┬────────┴────────┬────────┘
Valor del nibble: 4 1
Hexadecimal: 0x41 (dos dígitos = 1 byte)| Binario (4 bits) | Decimal | Hexadecimal | Binario (4 bits) | Decimal | Hexadecimal |
|---|---|---|---|---|---|
0000 |
0 | 0x0 |
1000 |
8 | 0x8 |
0001 |
1 | 0x1 |
1001 |
9 | 0x9 |
0100 |
4 | 0x4 |
1010 |
10 | 0xA |
0111 |
7 | 0x7 |
1111 |
15 | 0xF |
Siempre que veas dos caracteres hexadecimales juntos (como ff, 7f o 0a), estás viendo exactamente 1 byte (8 bits). Por eso una dirección MAC como 00:1a:2b:3c:4d:5e ocupa 6 bytes (48 bits).
§ Inspeccionar los bytes reales de un archivo
En cualquier sistema tipo Unix puedes observar los bytes exactos que componen un archivo utilizando xxd o hexdump -C:
printf "Hola\n" > saludo.txt
hexdump -C saludo.txt
00000000 48 6f 6c 61 0a |Hola.|
00000005Observa qué ocurre byte a byte:
48es el código ASCII hexadecimal de'H'($72$ en decimal).6f,6c,61corresponden a'o','l','a'.0a($10$ en decimal) es el carácter de salto de línea\n(Line Feed).
Si un campo de un protocolo de red tiene una longitud de 16 bits, ¿cuántos bytes ocupa y cuántos dígitos hexadecimales se necesitan para representarlo?