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


Tal vez pueda interesarte


Compartí este artículo