Por lo que entiendo, un compilador crea un archivo binario que consta de 1 y 0 que una CPU puede leer. Tengo un archivo binario, pero ¿cómo lo abro para ver los 1 y 0 que hay? Un editor de texto dice que no puede abrirlo ...
PD: ¿Tengo un ensamblado binario compilado que debería ser un código binario simple de 1 y 0?
Respuestas:
De acuerdo con esta respuesta de tyranid :
Actualizar
Según esta respuesta de Emilio Bool :
fuente
Varias personas han respondido algunos aspectos de la consulta, pero no todos.
Todos los archivos en las computadoras se almacenan como 1 y 0. Imágenes, archivos de texto, música, aplicaciones ejecutables, archivos de objetos, etc.
Todos son 0 y 1. La única diferencia es que se interpretan de manera diferente dependiendo de lo que los abra.
Cuando ve un archivo de texto usando
cat
, el ejecutable (cat
en este caso) lee todos los 1 y 0 y se los presenta convirtiéndolos en caracteres de su alfabeto o idioma relevante.Cuando ve un archivo usando un visor de imágenes, toma todos los 1 y 0 y los convierte en una imagen, dependiendo del formato del archivo y algo de lógica para resolverlo.
Los archivos binarios compilados no son diferentes, se almacenan como 1 y 0.
La respuesta de arzyfex le brinda las herramientas para ver esos archivos de diferentes maneras, pero leer un archivo como binario funciona para cualquier archivo en una computadora, al igual que verlo como octal, o hexadecimal, o de hecho ASCII, puede que no tenga sentido en cada uno de esos formatos.
Si desea comprender lo que hace un archivo binario ejecutable, debe verlo de una manera que le muestre el lenguaje del ensamblador (como inicio), que puede hacer usando,
objdump -d /path/to/binary
que es un desensamblador, toma el contenido binario y lo convierte de nuevo en ensamblador (que es un lenguaje de programación de muy bajo nivel).
objdump
no siempre se instala de manera predeterminada, por lo que es posible que deba instalarse dependiendo de su entorno Linux.Alguna lectura externa.
NB: como señala @Wildcard, es importante tener en cuenta que los archivos no contienen los caracteres 1 y 0 (como los ve en la pantalla), contienen datos numéricos reales, bits individuales de información que están en (1) o apagado (0). Incluso esa descripción es solo una aproximación de la verdad. El punto clave es que si encuentra un visor que le muestre los 1 y los 0, incluso eso sigue interpretando los datos del archivo y luego le muestra los caracteres ASCII para 0 y 1. Los datos se almacenan en formato binario ( ver el enlace del número binario arriba). La entrada wiki comunitaria de Pierre-Olivier cubre esto con más detalle.
fuente
cat
, el ejecutable (cat
en este caso) lee todos los 1 y 0 y se los presenta convirtiéndolos en caracteres de su alfabeto o idioma."cat
no hace eso; lo único quecat
hace es escribir bytes en la salida estándar (a menos que esté usando las opciones "dañinas" ). El programa del terminal (y / o el hardware del terminal, si corresponde, es decir, su firmware) determina cómo representar los bytes como caracteres, posiblemente con la ayuda del controlador TTY.A bajo nivel, un archivo se codifica como una secuencia de 0 y 1.
Pero incluso los programadores rara vez van allí en la práctica.
Primero (y más importante que esta historia de 0 y 1), debes entender que todo lo que la computadora manipula está codificado con números .
Un carácter se codifica con un número, usando tablas de juego de caracteres. Por ejemplo, la letra 'A' tiene un valor de 65 cuando se codifica utilizando ASCII. Ver http://www.asciitable.com
Un píxel se codifica con uno o más números (hay muchos formatos gráficos). Por ejemplo, en el formato estándar de 3 colores, un píxel amarillo se codifica como: 255 para rojo, 255 para verde, 0 para azul. Consulte http://www.quackit.com/css/css_color_codes.cfm (elija un color y vea las celdas R, G y B)
Un archivo ejecutable binario se escribe en ensamblador; cada instrucción de ensamblaje se codifica como números. Por ejemplo, la instrucción de ensamblaje
MOVB $0x61,%al
está codificada por dos números: 176,97 Consulte http://www.sparksandflames.com/files/x86InstructionChart.html (Cada instrucción tiene un número asociado de 00 a FF, porque se usa la notación hexadecimal, vea abajo)En segundo lugar : cada número puede tener múltiples representaciones o anotaciones .
Digamos que tengo 23 manzanas.
Pero también puedo hacer grupos de 16 manzanas. Así que obtendré un grupo de 16 y 7 manzanas solitarias. En notación hexadecimal (así se llama la raíz 16), escribiré: 17 (16 + 7). Para distinguir de la notación decimal, la notación hexadecimal generalmente se observa con un prefijo o sufijo: 17h, # 17 o $ 17. Pero, ¿cómo representar más de 9 grupos de 16 o más de 9 manzanas solas? Simplemente, usamos letras de A (10) a F (15). El número 31 (como en 31 manzanas) se escribe como # 1F en hexadecimal.
En la misma línea, podemos hacer un grupo de dos manzanas. (Y grupo de dos manzanas de grupo de dos, es decir, grupo de manzanas de 2x2, y así sucesivamente). Entonces 23 es: 1 grupo de 2x2x2x2 manzanas, 0 grupo de 2x2x2 manzanas, 1 grupo de 2x2 manzanas, 1 grupo de 2 manzanas y 1 manzana solitaria.
(Ver https://en.wikipedia.org/wiki/Radix )
Físicamente, los mecanismos que permiten dos estados (conmutadores) son fáciles de hacer, también en el disco que en el almacenamiento de memoria.
Es por eso que los datos y programas, vistos como números, se escriben y manipulan en su forma binaria.
Luego se traducen, según el tipo de datos, a su forma apropiada (letra A, píxel amarillo) o se ejecutan (instrucción MOV).
hexdump
enumera los números que codifican los datos (o el programa de ensamblaje) en su forma hexadecimal. Luego puede usar una calculadora para obtener la forma binaria correspondiente.fuente
Comenzaría con
od
(volcado octal) y, dependiendo del sistema, puede encontrar herramientasobjdump
útiles.fuente
Puede abrirlo en un editor hexadecimal que lo muestra como una serie de valores hexadecimales.
xxd file
¿Qué está tratando de lograr?
fuente
bvi
es un editor visual binario con combinaciones de teclas vim. Está disponible en la mayoría de los sistemas Linux.fuente
El comando de cadenas de Linux imprime las cadenas de caracteres imprimibles en archivos, por ejemplo:
etc ... es bastante más legible que binario.
fuente
strings
comando eliminará la mayoría de los bytes que quiere ver.strings
comando, especialmente con una longitud más larga comostrings -n 6
, realmente ayuda a descubrir qué tiene un archivo binario si contiene constantes de cadena, etc. Esta respuesta debería haber sido un comentario, entonces sería han estado bienstrings
utilidad del comando, solo el hecho de que no responde la pregunta OP aquí.Una parte importante sobre la que aún parece confundido: los valores hexadecimales son solo una representación diferente de los valores binarios. La mayoría de los editores hexadecimales o hexdumps mostrarán valores en la base hexadecimal, porque es más legible que en la base binaria.
P.ej:
Binario:
Que es 35 y 32 en decimal
También 35 y 32 en decimal
fuente
vim
instalar para usarxxd
.Puede ver el archivo en binario en
vim
:vim
:% !xxd -b
El
xxd
comando se puede modificar aún más, por ejemplo:-g4
, que agrupará los bits en paquetes de 32 bits-c4
, que formateará la salida, para tener 4 bytes por líneaSi agrega los dos indicadores anteriores, obtendrá un número entero de 32 bits por línea.
fuente
Puedes hacerlo con, por ejemplo, este rubí de una sola línea:
El sistema tradicional basado en C tiene un pésimo soporte para generar cosas en binario, AFAIK. Por lo general, no es muy útil, ya que es bastante difícil de leer a diferencia de los volcados hexadecimales.
fuente
%08b
hace que agrupe la salida en bytes.GHex es tu amigo :)
Puedes instalarlo usando la línea de comandos
Ubuntu:
Fedora
fuente