Planeta TTY

Comando od

Posted in Manipulacion de Texto by Jorgito Capurro on 8 julio 2009

El comando od (Octal Dump) nos permite ver byte a byte el contenido de un archivo. Podemos visualizarlo en varios formatos, como por ejemplo:

  • Números Octales
  • Números Hexadecimales
  • Caracteres Visibles y No Visibles
  • etc.

Veamos de que manera nos puede resultar muy útil utilizarlo…

Sintaxis

od [opciones] [archivo(s)]

Ahora bien, tomemos como ejemplo el siguiente código fuente de un programa básico escrito en Lenguaje C:

#include <stdio.h>

int main()
{
   char nombre[20];
   unsigned int edad=0;

   printf( "Escriba su nombre: " );
   scanf ( "%s", nombre );
   printf( "Escriba su edad: " );
   scanf ("%u", &edad );

   printf( "\nHola %s. Tienes %d años.\n", nombre, edad );

   return 0;
}

Supongamos que este programa ,al que llamaremos lectura.c, nos lo ha traído un amigo desde una PC con Windows sin que nosotros sepamos, es decir, su código fue escrito en Windows, por ejemplo, usando el Bloc de Notas. Como sabemos, la codificación del carácter nueva línea es representado de forma distinta en Windows que en GNU/Linux, lo cual al querer compilar nuestro programa, puede suceder que recibamos mensajes de error. La codificación del carácter de nueva línea en los distintos sistemas es la siguiente:

  • GNU/Linux y Sistemas de tipo UNIX: LF
  • DOS/Windows: CR+LF

Los valores numéricos son:

  • CR: Decimal 13, Hexadecimal 0d, caracter \n
  • LF: Decimal 10, Hexadecimal 0a, caracter \r

Mediante el comando od, somos capaces de detectar este tipo de fallas, por ejemplo, viendo el contenido del archivo de código fuente representado en Hexadecimal. Por ejemplo, si nuestro archivo contiene caracteres de representación de nueva línea del tipo CRLF (o odoa en Hexadecimal), tendremos que convertir dicha representacion en una soportada por GNU/Linux, es decir, LF (oa).

Ya hemos de terminado de plantear la problemática. Ahora veamos la utilización de este potente comando para su solucion. En su uso por default, od muestra el archivo pasado como parámetro expresado en números octales de a dos bytes.
Por ejemplo, si ejecutamos el siguiente comando:

$ od lectura.c

Obtendremos la siguiente salida:

0000000 021551 067143 066165 062145 020074 071564 062151 067456
0000020 064076 006412 006412 064556 072040 066541 064556 024051
0000040 006412 075415 005040 020040 061550 060562 020156 067555
0000060 061162 062533 031060 056473 006412 020040 020165 067163
0000100 064547 067145 062040 064556 072040 062544 060544 036460
0000120 035415 005015 005040 020040 070162 064556 072146 024040
0000140 021105 071543 071151 061141 020163 072440 067157 066542
0000160 071145 035040 021040 024473 006412 020040 020163 061541
0000200 067146 020050 020042 022563 021054 020156 067555 061162
0000220 062440 024473 006412 020040 020160 071151 067164 063050
0000240 020042 042563 061562 064542 060440 071565 020145 062141
0000260 062072 020042 020051 035415 005040 020040 071543 060556
0000300 063040 024042 022565 021054 020046 062544 060544 020051
0000320 035415 005040 020040 020040 020015 005040 020040 070162
0000340 064556 072146 024040 021134 067110 067554 060440 022563
0000360 027040 052151 062556 062563 020045 062040 060761 067563
0000400 027134 067042 026040 067157 066542 071145 026040 062544
0000420 060544 020051 035415 005040 020040 006412 020040 020162
0000440 062564 072562 067040 030073 006412 076415 005015 005000
0000457

Esto nos acerca un poco mejor a solucionar nuestro problema, pero no es suficiente. Mejor, veamos el archivo carácter a carácter, para poder analizarlo mas a fondo. La opcion -c muestra los caracteres individuales, visibles y no visibles. La primer columna de la salida indica el numero de línea del archivo:

$ od -c lectura.c
0000000 # i n c l u d e \r \n \r \n i n t m a i n ( )
0000040 \r \n { \r \n c h a r n o m
0000060 b r e [ 2 0 ] ; \r \n u n s
0000100 i g n e d i n t e d a d = 0
0000120 ; \r \n \r \n p r i n t f (
0000140 ” E s c r i b a s u n o m b
0000160 r e : ” ) ; \r \n s c a
0000200 n f ( ” % s ” , n o m b r
0000220 e ) ; \r \n p r i n t f (
0000240 ” E s c r i b a s u e d a
0000260 d : ” ) ; \r \n s c a n
0000300 f ( ” % u ” , & e d a d )
0000320 ; \r \n \r \n p r
0000340 i n t f ( ” \ n H o l a % s
0000360 . T i e n e s % d a 361 o s
0000400 . \ n ” , n o m b r e , e d
0000420 a d ) ; \r \n \r \n r
0000440 e t u r n 0 ; \r \n } \r \n \r \n
0000457

¡Ajam! Analicemos esta salida. Observando la ultima línea, vemos algo muy interesante. Luego de finalizar la sentencia return (ver linea 0000440), observamos la secuencia de caracteres \r \n dos veces. El caracterer oculto \r indica retorno de carro, mientras que \n indica nueva linea. Como mencione con anterioridad, las “nuevas lineas” en UNIX se representan mediante LF, su equivalente en carácter a \r. En conclusión, este archivo esta representando las nuevas líneas de la forma que lo hace Windows, es decir, mediante \n (CR) y \r (LF). Para estar mas seguros, podemos visualizar el archivo mediante su representacion en Hexadecimal. Anticipando la respuesta, cuando se nos presente la combinación de \n\r nos tendria que representar como odoa (Hexadecimal). La opcion para visualizar un archivo en Hexadecimal es -h, que en este caso, la combinaremos con -c para ver sus caracteres ocultos al mismo tiempo:

$ od -ch lectura.c
0000000 2369 6e63 6c75 6465 203c 7374 6469 6f2e
# i n c l u d e \r \n \r \n i n t m a i n ( )
0000040 0d0a 7b0d 0a20 2020 6368 6172 206e 6f6d
\r \n { \r \n c h a r n o m
0000060 6272 655b 3230 5d3b 0d0a 2020 2075 6e73
b r e [ 2 0 ] ; \r \n u n s
0000100 6967 6e65 6420 696e 7420 6564 6164 3d30
i g n e d i n t e d a d = 0
0000120 3b0d 0a0d 0a20 2020 7072 696e 7466 2820
; \r \n \r \n p r i n t f (
0000140 2245 7363 7269 6261 2073 7520 6e6f 6d62
” E s c r i b a s u n o m b
0000160 7265 3a20 2220 293b 0d0a 2020 2073 6361
r e : ” ) ; \r \n s c a
0000200 6e66 2028 2022 2573 222c 206e 6f6d 6272
n f ( ” % s ” , n o m b r
0000220 6520 293b 0d0a 2020 2070 7269 6e74 6628
e ) ; \r \n p r i n t f (
0000240 2022 4573 6372 6962 6120 7375 2065 6461
” E s c r i b a s u e d a
0000260 643a 2022 2029 3b0d 0a20 2020 7363 616e
d : ” ) ; \r \n s c a n
0000300 6620 2822 2575 222c 2026 6564 6164 2029
f ( ” % u ” , & e d a d )
0000320 3b0d 0a20 2020 2020 200d 0a20 2020 7072
; \r \n \r \n p r
0000340 696e 7466 2820 225c 6e48 6f6c 6120 2573
i n t f ( ” \ n H o l a % s
0000360 2e20 5469 656e 6573 2025 6420 61f1 6f73
. T i e n e s % d a 361 o s
0000400 2e5c 6e22 2c20 6e6f 6d62 7265 2c20 6564
. \ n ” , n o m b r e , e d
0000420 6164 2029 3b0d 0a20 2020 0d0a 2020 2072
a d ) ; \r \n \r \n r
0000440 6574 7572 6e20 303b 0d0a 7d0d 0a0d 0a00
e t u r n 0 ; \r \n } \r \n \r \n
0000457

Efectivamente comprobamos a causa de la ultima línea, que nuestro archivo esta compuesto por \n\r o dicho en Hexadecimal, por odoa.

Para poder revertir este problema, podemos usar las herramientas dos2unix y unix2dos, que transforman entre las codificaciones CRLF (DOS/Windows) y LF (Unix). Hay varias versiones de estos programas, con sintaxis algo distintas.

Se puede usar también el comandotr (Translator), que se encuentra en cualquier Sistema de tipo Unix, y que permite hacer cualquier tipo de transformación de caracteres.
Por ejemplo, para pasar de DOS/Windows a Unix de la siguiente manera:

tr -d ‘\r’ lectura.c

Vale la pena aclarar que el comando tr no solo es utilizado para este fin, sino que fue creado para usos mas amplios. Estudiaremos el comando tr en detalle mas adelante.

¡Espero que les halla sido de utilidad!

Saludos

Anuncios

Una respuesta

Subscribe to comments with RSS.

  1. chatcafeelcafe said, on 6 noviembre 2013 at 14:17

    Increible tu post me puedes ayudar para decodificar un archivo? no logro aplicar el tr -d ‘\r’ gracias


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: