2011-12-15 44 views
8

¿Cómo puedo crear un archivo binario con los valores binarios consiguientes en bash?crear archivo binario en bash

como:

$ hexdump testfile 
0000000 0100 0302 0504 0706 0908 0b0a 0d0c 0f0e 
0000010 1110 1312 1514 1716 1918 1b1a 1d1c 1f1e 
0000020 2120 2322 2524 2726 2928 2b2a 2d2c 2f2e 
0000030 .... 

En C, que hago:

fd = open("testfile", O_RDWR | O_CREAT); 
for (i=0; i< CONTENT_SIZE; i++) 
{ 
    testBufOut[i] = i; 
} 
num_bytes_written = write(fd, testBufOut, CONTENT_SIZE); 
close (fd); 

esto es lo que quería:

#!/bin/bash 
i=0 
while [ $i -lt 256 ]; do 
    h=$(printf "%.2X\n" $i) 
    echo "$h"| xxd -r -p 
    i=$((i-1)) 
done 
+1

Incluso si probablemente simplificó su ejemplo para hacerlo más corto: Este código no verifica los errores Y NO UTILIZA write (2) porque está perfectamente bien no solo para fallar, sino también para hacer escrituras parciales. Use fwrite (3) o similar en su lugar –

Respuesta

6

tal vez usted podría echar un vistazo a xxd :

xxd: crea un volcado hexadecimal de un archivo determinado o entrada estándar. Puede también convertir un volcado hexadecimal a su forma binaria original.

+0

gracias, 'xxd' era lo que necesitaba – mustafa

+2

Para aquellos que querían saber cómo usar' xxd' para escribir sin tener que irse y buscarlo (como tenía que hacerlo): 'echo "0000400: 4142 4344" | xxd -r - data.bin' donde '0000400' es el desplazamiento de bytes en el archivo y los bytes hexadecimales' 41' a '44' son los que están escritos (el espacio incrustado se ignora). Este ejemplo escribe la cadena 'ABCD' a 1024 bytes en el archivo 'data.bin'. – starfry

10

Sólo hay 1 byte no se puede pasar como argumento en la línea de comandos bash: 0 Para cualquier otro valor, sólo puede redirigirlo. Es seguro.

echo -n $'\x01' > binary.dat 
echo -n $'\x02' >> binary.dat 
... 

Para el valor 0, no hay otra forma de salida a un archivo

dd if=/dev/zero of=binary.dat bs=1c count=1 

para anexar al archivo, utilice

dd if=/dev/zero oflag=append conv=notrunc of=binary.dat bs=1c count=1 
+1

Just 'dd if =/dev/zero bs = 1 count = 1' wothout' of' y 'oflag' muestra el byte' NUL' en stdout. Entonces puedes hacer un '>' o '>>'. – glglgl

2

Si no le importa que no use un comando existente y desee describir sus datos en un archivo de texto, puede usar binmake que es un programa C++ que puede compilar y usar de la siguiente manera:

En primer lugar obtener y compilar binmake (los binarios estarán en bin/):

$ git clone https://github.com/dadadel/binmake 
$ cd binmake 
$ make 

Crear su archivo de texto file.txt:

big-endian 
00010203 
04050607 
# separated bytes not concerned by endianess 
08 09 0a 0b 0c 0d 0e 0f 

Generar el archivo binario file.bin:

$ ./binmake file.txt file.bin 
$ hexdump file.bin 
0000000 0100 0302 0504 0706 0908 0b0a 0d0c 0f0e    
0000008 

Nota: también puede usarlo con stdin/stdout

+0

Si sigue esta ruta, probablemente solo deba usar una herramienta estándar (od para portabilidad o xxd para uso). –