Ene 19 2012
Editor Hexadecimal en emacs: Hexl-mode
Generalmente no suelo necesitar emplear el uso de editores hexadecimal, sin embargo existe un modo en especial en emacs para usarlo sin necesidad de salir a la consola. Recordemos que en consola podemos hacer uso de od, objdump y el comando file entre otros, para analizar ficheros. Para lanzar el editor hexadecimal en emacs tan solo debemos invocar a la funciona mediante M-x hexl-mode. Eso editara el fichero en modo hexadecimal.
A la izquierda la ventana con el modo hexl y a la derecha una copia del fichero empleando el whitespace-mode
La primera fila muestra el titulo de la tabla representada a continuacion. El primer valor es la direccion de memoria donde se almacena el contenido del fichero, y las siguientes filas indicaran su offset. Mas tarde nos encontramos con los valores que toma cada una de esas celdas de memoria, caracter a caracter (byte a byte realmente, en grupos de dos) en su valor hexadecimal, hasta el 15 (f). Recordemos que internamente el computador trabaja en hexadecimal por comodidad porque es como se emplea la memoria, de 16 en 16 bytes (de 0 al 15 – 0 a f). Finalmente a la derecha tenemos la traduccion en ascii de cada una de esas posiciones. En la otra ventana podemos comparar con el whitespace-mode ademas.
El fin de este articulo es solo nombrar que es posible emplear este modo (y bastante comodo y rapido). Sin embargo, si dare unas nociones basicas para aquellos que esten interesados en comenzar a trabajar y debuggear algun problema con algun fichero.
Antes de nada decir que es importante saber en que formato esta el fichero, si en DOS o en Unix. En el caso de estar en formato Unix el famoso CRLF es 0d0a. Aqui tenemos algunas valores hexadecimales importantes a la hora de analizar los ficheros:
- CRLF -> 0d0a
- INTRO -> 0a
- SPACE -> 20
- Control+z -> 1a (recordemos que en unix el control+z se suele emplear como el char de EOF)
- 0 -> 30 (el numero 0)
- . -> 2e (el punto)
En asciitable y asciicl es posible encontrar una lista mas completa de otros caracteres generalmente menos interesantes.
Generalmente si tenemos un error de EOF prematuro, lo que debemos buscar es cualquier caracter con valor menor a 0x20, entonces es sospechoso. Aunque a veces el problema esta en los parsers que no esperan (segun el formato del fichero) cierto tipo de caracter y se encuentran con un espacio, intro, o un caracter aunque sea imprimible no esperado, como ha sido el caso con el que me ha tocado pelear hoy.
Por supuesto es posible cambiar un caracter cualquiera por otro, para ello debemos darle el valor que queramos alli donde nos encontremos, pudiendo reemplazar un 1a (de EOF) por un 0a de intro o cualquier otro caso.
- C-M-d : inserta un byte en formato decimal
- C-M-o : inserta un byte en formato octal
- C-M-x : inserta un byte en formato hexadecimal
- C-x [ : Se mueve al principio de una pagina (1 Kb)
- C-x ] : Se mueve al final de una pagina (1 Kb)
- M-g : Salta a la direccion especificada en hexadecimal.
- M-j : Salta a la direccion espcificada en decimal
Finalmente con C-c C-c para salir del editor hexadecimal de emacs para volver al anterior y mas comun para los mortales.
Gracias a |[TDP]| por sus sugerencias respecto al tema ha sido posible escribir este pequeno articulo.