Una dirección, cuatro representaciones
Internamente, una IPv4 es un entero sin signo de 32 bits. La notación decimal punteada es solo una forma legible: divide los 32 bits en cuatro octetos y escribe cada uno en decimal (0 a 255). Las demás representaciones aparecen en distintos contextos:
- Binario: subnetting, cálculo de máscaras y sumarización.
- Hexadecimal: capturas de paquetes (Wireshark, tcpdump -X), volcados de memoria, máscaras en algunos sistemas (
ifconfigen BSD muestra0xffffff00). - Entero: bases de datos (columnas
INT UNSIGNEDconINET_ATON()en MySQL), bases de geolocalización y comparaciones de rangos.
Conversión decimal ↔ binario
Cada octeto se descompone en potencias de 2, del bit de mayor peso al de menor:
Ejemplo: 192 = 128 + 64 → 11000000; 168 = 128 + 32 + 8 → 10101000; 1 → 00000001.
Ejemplo completo: 192.168.1.1
| Octeto | Decimal | Binario | Hex |
|---|---|---|---|
| 1 | 192 | 11000000 | C0 |
| 2 | 168 | 10101000 | A8 |
| 3 | 1 | 00000001 | 01 |
| 4 | 1 | 00000001 | 01 |
Hexadecimal: 0xC0A80101. Entero: 192 × 256³ + 168 × 256² + 1 × 256 + 1 = 3,232,235,777.
Para volver del entero a la IP, divida sucesivamente por 256 y tome los restos, o use desplazamientos de bits: (n >> 24) & 255, (n >> 16) & 255, etc.
En la línea de comandos
# Python
python3 -c "import ipaddress; print(int(ipaddress.IPv4Address('192.168.1.1')))"
python3 -c "import ipaddress; print(ipaddress.IPv4Address(3232235777))"
# MySQL / MariaDB
SELECT INET_ATON('192.168.1.1'), INET_NTOA(3232235777);
# Bash: hex de cada octeto
printf '%02X' 192 168 1 1; echo
Detalles a tener en cuenta
- Muchos sistemas aceptan formatos “raros”:
ping 3232235777oping 0xC0A80101funcionan en Linux y Windows. Esto se usa a veces para evadir filtros de URL; los WAF deben normalizar la dirección. - Un cero a la izquierda puede interpretarse como octal en algunas bibliotecas (
010= 8). Evite ceros a la izquierda en configuraciones. - En el cable, la dirección viaja en orden de bytes de red (big-endian): el primer octeto se transmite primero.