Hace mucho tiempo demostré cómo volcar archivos binarios en diferentes formatos con hexdump
. En esta oportunidad voy a demostrar cómo utilizar la herramienta od
para volcar archivos en modo octal y otros formatos.
La herramienta od
es parte del paquete coreutils y sirve para volcar el contenido de un archivo en formato octal y otros. Generalmente se vuelca el contenido de un archivo en formato ASCII o hexadecimal, ya que son bases potencia de dos o se representan con una cantidad de bits múltiplo de 8. Esto significa que caben correctamente dentro de 1 byte (8 bits). El formato ASCII emplea 8 bits por caracter, mientras que la base hexadecimal emplea 4 bits por dígito (de esta forma 2 dígitos hexadecimales caben exactamente en 1 byte). Otros formatos y codificaciones de caracteres (como por ejemplo UTF) son multi-byte. Es decir, un dígito puede emplear más de 1 byte. Pero siempre empleando un byte entero.
En el caso de la base octal, ésta es potencia de dos (23) pero, al representarse con una cantidad de bits (3) que no es múltiplo de 8, sus dígitos no caben exactamente dentro de 1 byte. Sin embargo puede ser necesario volcar el contenido de un archivo en una base numérica que no sea potencia de dos, o que no sean potencia de dos o múltiplo de 8, tales como la base octal o decimal.
Veamos cómo volcar el contenido de un archivo en formato octal:
emi@hal9000:~$ od -t o /bin/pwd | head 0000000 10623042577 00000200402 00000000000 00000000000 0000020 00017400003 00000000001 00000022600 00000000000 0000040 00000000100 00000000000 00000111600 00000000000 0000060 00000000000 00016000100 00020000013 00007000035 0000100 00000000006 00000000004 00000000100 00000000000 0000120 00000000100 00000000000 00000000100 00000000000 0000140 00000001150 00000000000 00000001150 00000000000 0000160 00000000010 00000000000 00000000003 00000000004 0000200 00000001250 00000000000 00000001250 00000000000 0000220 00000001250 00000000000 00000000034 00000000000
Cada fila en la salida corresponde con un conjunto de 16 bytes contiguos. La primera columna es la dirección de comienzo de los 16 bytes, en formato octal. Los primeros 16 bytes comienzan en la dirección 0, los segundos 16 bytes comienzan en la dirección 16 (20 en base octal).
Las siguientes cuatro columnas representan un conjunto de 4 bytes, cuyo valor se describe mediante 11 dígitos octales. Estos 11 dígitos octales representan 33 bits, aunque 4 bytes equivales a 32 bits. Claramente sobre un bit, y es el más significativo, que vale siempre cero. Por esta razón el primer dígito octal siempre es < 4:
decimal binario octal hexadecimal 0 000 0 0 1 001 1 1 2 010 2 2 3 011 3 3 4 100 4 4 5 101 5 5 6 110 6 6 7 111 7 7 8 1000 10 8 9 1001 11 9 10 1010 12 a 11 1011 13 b
od
también soporta otros formatos como decimal y hexadecimal. Veamos la misma salida en formato decimal:
emi@hal9000:~$ od -t d /bin/pwd | head 0000000 1179403647 65794 0 0 0000020 4063235 1 9600 0 0000040 64 0 37760 0 0000060 0 3670080 4194315 1835037 0000100 6 4 64 0 0000120 64 0 64 0 0000140 616 0 616 0 0000160 8 0 3 4 0000200 680 0 680 0 0000220 680 0 28 0
Cuando se indica el tipo de salida decimal, simplemente se muestra el valor decimal contenido en cada paquete de 4 bytes. El ordenamiento de bytes por defecto es little endian (esto es el byte menos significativo en la menor dirección de memoria). Es posible cambiar el endianess con la opción --endian
, que toma como parámetros "big" o "little":
emi@hal9000:~$ od --endian=big -t d /bin/pwd | head 0000000 2135247942 33620224 0 0 0000020 50347520 16777216 -2145058816 0 0000040 1073741824 0 -2137849856 0 0000060 0 1073756160 184565760 486546432 0000100 100663296 67108864 1073741824 0 0000120 1073741824 0 1073741824 0 0000140 1744961536 0 1744961536 0 0000160 134217728 0 50331648 67108864 0000200 -1476263936 0 -1476263936 0 0000220 -1476263936 0 469762048 0
En formato hexadecimal, 8 dígitos hexadecimales caben perfectamente en cada paquete de 4 bytes (por representarse cada dígito por un múltiplo de 8 bits, es decir 4 bits):
emi@hal9000:~$ od -t x /bin/pwd | head 0000000 464c457f 00010102 00000000 00000000 0000020 003e0003 00000001 00002580 00000000 0000040 00000040 00000000 00009380 00000000 0000060 00000000 00380040 0040000b 001c001d 0000100 00000006 00000004 00000040 00000000 0000120 00000040 00000000 00000040 00000000 0000140 00000268 00000000 00000268 00000000 0000160 00000008 00000000 00000003 00000004 0000200 000002a8 00000000 000002a8 00000000 0000220 000002a8 00000000 0000001c 00000000
Tal como se observa, por más que se cambie el formato para representar los valores de los bytes, la dirección de comienzo siempre está expresada en base octal.
od
posee opciones adicionales para controlar el formato. Por ejemplo, cambiar la cantidad de bytes por fila mediante la opción -w
(la cantidad de bytes pasada como parámetro a esta opción debe estar pegada, sin espacios en blanco de por medio):
emi@hal9000:~$ od -w32 -t x /bin/pwd | head 0000000 464c457f 00010102 00000000 00000000 003e0003 00000001 00002580 00000000 0000040 00000040 00000000 00009380 00000000 00000000 00380040 0040000b 001c001d 0000100 00000006 00000004 00000040 00000000 00000040 00000000 00000040 00000000 0000140 00000268 00000000 00000268 00000000 00000008 00000000 00000003 00000004 0000200 000002a8 00000000 000002a8 00000000 000002a8 00000000 0000001c 00000000 0000240 0000001c 00000000 00000001 00000000 00000001 00000004 00000000 00000000 0000300 00000000 00000000 00000000 00000000 000014d0 00000000 000014d0 00000000 0000340 00001000 00000000 00000001 00000005 00002000 00000000 00002000 00000000 0000400 00002000 00000000 00003d39 00000000 00003d39 00000000 00001000 00000000 0000440 00000001 00000004 00006000 00000000 00006000 00000000 00006000 00000000
Para otros formatos, consultar la página de manual:
man od