Dentro de los formatos de archivo binarios: cabeceras PNG, ZIP y Mach-O explicadas
Cada formato de archivo que usas a diario, imagen, archivo comprimido, ejecutable, tiene una estructura definida hasta el byte, y casi nada de esa estructura es visible a través de las herramientas con las que normalmente abres esos archivos. Vista Previa te muestra una imagen. Utilidad de Archivo te muestra archivos extraídos. Ninguna te muestra los bytes que hicieron posibles esos resultados. Esto es lo que tres formatos habituales tienen por debajo en realidad, y cómo mirarlo tú mismo.
PNG: una secuencia de chunks etiquetados
Cada archivo PNG empieza con los mismos ocho bytes: 89 50 4E 47 0D 0A 1A 0A. Eso no son datos de imagen, es una firma, elegida a propósito para incluir un byte que se vuelve inservible si el archivo se transfiere por accidente como texto (0x0A y 0x0D son caracteres de salto de línea, así que una transferencia rota en modo texto los corrompe de una forma fácil de detectar).
Después de la firma, todo en un PNG es un chunk, y cada chunk sigue la misma disposición de cuatro partes:
- Longitud (4 bytes): cuántos bytes de datos siguen, sin contar el tipo ni el CRC.
- Tipo (4 bytes, siempre ASCII): un código de cuatro letras como
IHDR(cabecera de imagen, siempre el primero),IDAT(datos de píxel comprimidos, puede haber varios) oIEND(marca el final del archivo). - Datos: lo que ese tipo de chunk especifique. Los datos de
IHDRson el ancho, el alto, la profundidad de bits y el tipo de color, siempre con la misma disposición fija. - CRC (4 bytes): una suma de comprobación del tipo y los datos, para que un descodificador pueda detectar un chunk corrupto en lugar de malinterpretarlo en silencio.
Ese es el formato entero. Un descodificador de PNG simplemente recorre chunk tras chunk, leyendo la longitud para saber cuánto saltar, hasta que llega a IEND.
ZIP: cabeceras locales, y luego un directorio al final
Un archivo ZIP almacena cada archivo con su propia cabecera de archivo local, marcada por la firma 50 4B 03 04 (el PK del principio es una referencia a Phil Katz, el creador del formato). Esa cabecera incluye el nombre del archivo, el método de compresión y tanto el tamaño comprimido como el sin comprimir, seguidos inmediatamente de los datos comprimidos del archivo.
La parte que confunde a la gente: esos tamaños y sumas de comprobación por archivo de la cabecera local a veces son cero, con los valores reales almacenados más adelante en un “descriptor de datos”, porque ZIP se diseñó para admitir escrituras en streaming donde el tamaño final no se conoce hasta que los datos ya se han escrito. La lista definitiva de lo que hay realmente en el archivo reside en un directorio central al final del todo, que es también la razón por la que algunos ZIP corruptos o truncados pueden parecer que tienen contenido cuando los escaneas desde el principio, pero no se abren, porque la herramienta que usas lee primero el directorio central y este falta o está dañado.
Mach-O: número mágico, y luego comandos de carga
Mach-O es el formato de ejecutable que macOS usa para los binarios compilados. Empieza con un número mágico que le dice al cargador dos cosas a la vez: si es de 32 o 64 bits, y qué orden de bytes usa el resto del archivo. 0xFEEDFACE es de 32 bits, 0xFEEDFACF es de 64 bits, y si ves los bytes invertidos (0xCEFAEDFE o 0xCFFAEDFE), significa que el archivo se escribió en el orden de bytes opuesto al de la máquina que lo lee.
Después del número mágico viene una cabecera fija (tipo de CPU, tipo de archivo y un recuento de comandos de carga), seguida de esa cantidad de comandos de carga en secuencia. Los comandos de carga son la forma en que un archivo Mach-O describe todo lo que el cargador necesita: qué segmentos mapear en memoria, qué bibliotecas dinámicas enlazar, dónde está el punto de entrada. Es una idea parecida a los chunks de PNG: una cabecera fija, y luego una secuencia de registros autodescriptivos, cada uno diciéndole al lector cuánto saltar para llegar al siguiente.
Mirar esto tú mismo
Nada de esto requiere escribir un analizador. Abre cualquier archivo PNG, ZIP o Mach-O en Hexter y la pestaña Analizar reconoce el formato automáticamente, recorriendo la estructura real de chunks o de comandos de carga y mostrándola como un árbol junto al hex en crudo, para que puedas hacer clic en un campo y ver exactamente de qué bytes vino. Es de solo lectura por defecto, así que esto se puede hacer con total seguridad sobre un archivo real, un binario de app, una captura de pantalla, un archivo comprimido que descargaste, sin ningún riesgo de alterarlo.
Si quieres verificar lo de arriba a mano en su lugar: abre un PNG y comprueba que los primeros ocho bytes coinciden con la firma, luego mira los bytes del 8 al 11 (la longitud del primer chunk) y los bytes del 12 al 15 (su tipo, que debería leerse IHDR). Es un ejercicio lo bastante pequeño como para hacerlo en un par de minutos, y es una forma genuinamente útil de entender un formato de archivo que has usado toda la vida pero que nunca has mirado de verdad.