Tengo un archivo binario que me gustaría incluir en mi código fuente C (temporalmente, para fines de prueba), así que me gustaría obtener el contenido del archivo como una cadena C, algo así:
\x01\x02\x03\x04
¿Es esto posible, quizás utilizando las utilidades od
o hexdump
? Si bien no es necesario, si la cadena puede ajustarse a la siguiente línea cada 16 bytes de entrada e incluir comillas dobles al comienzo y al final de cada línea, ¡eso sería aún mejor!
Soy consciente de que la cadena tendrá nulos incrustados ( \x00
), por lo que necesitaré especificar la longitud de la cadena en el código, para evitar que estos bytes terminen la cadena antes.
Respuestas:
Casi puede hacer lo que quiera
hexdump
, pero no puedo entender cómo obtener comillas y barras diagonales simples en la cadena de formato. Así que hago un pequeño postprocesamiento consed
. Como beneficio adicional, también he sangrado cada línea por 4 espacios. :)Editar
Como Cengiz Can señaló, la línea de comando anterior no se adapta bien a las líneas de datos cortas. Así que aquí hay una nueva versión mejorada:
Como Malvineous menciona en los comentarios, también tenemos que pasar la
-v
opción detalladahexdump
para evitar que abrevie longitudes largas de bytes idénticos a*
.fuente
-v
opciónhexdump
, de lo contrario, las ejecuciones largas del mismo byte de entrada causan líneas de salida que dicen"*"
.xxd
tiene un modo para esto. La opción-i
/--include
:Puede volcar eso en un archivo para ser
#include
d, y luego simplemente accederfoo
como cualquier otra matriz de caracteres (o vincularlo). También incluye una declaración de la longitud de la matriz.La salida se ajusta a 80 bytes y se parece esencialmente a lo que podría escribir a mano:
xxd
es, algo extraño, parte de lavim
distribución, por lo que es probable que ya la tenga. Si no es así, ahí es donde lo obtienes: también puedes construir la herramienta por sí sola desde lavim
fuente.fuente
objcopy
sería mejorobjcopy
permitiría que OP vincule los datos binarios con el ejecutable como un archivo objeto, lo cual es útil pero no exactamente lo que se pregunta aquí.foo
/foo_len
aquí, y que no sería muy desperdiciar espacio de almacenamiento. Estoy convencido de que el OP estaría mejorobjcopy
y que se ajusta a sus necesidades.objcopy
está bien cuando está cerca, pero no es portátil y la salida aún menos. Ciertamente puede ser parte de una buena solución permanente, pero esa no es la cuestión aquí.xxd
es bueno pero el resultado es muy detallado y ocupa mucho espacio de almacenamiento.Puedes lograr prácticamente lo mismo usando
objcopy
; p.ejLuego enlace
foo.o
a su programa y simplemente use los siguientes símbolos:Este no es un literal de cadena, pero es esencialmente lo mismo en lo que se convierte un literal de cadena durante la compilación (considere esa cadena tenga en literales de en realidad no existen en tiempo de ejecución; de hecho, ninguna de las otras respuestas realmente le da un literal de cadena incluso en tiempo de compilación) y se puede acceder en gran medida de la misma manera:
La desventaja es que debe especificar su arquitectura de destino para que el archivo de objeto sea compatible, y esto puede no ser trivial en su sistema de compilación.
fuente
Debe ser exactamente lo que pediste:
fuente
Esta es una breve utilidad que escribí que esencialmente hace lo mismo (originalmente publicado en Stack Overflow ):
fuente
Si estás en Python, cárgalo en una variable "buff" y usa algo como esto:
fuente