2012-03-31 26 views
12

Duplicar posible:
using bash: write bit representation of integer to fileBash: escribir número entero de archivo binario

que necesito para escribir el tamaño de un archivo en un archivo binario. Por ejemplo:

$ stat -c %s in.txt 
68187 

$ stat -c %s in.txt >> out.bin 

En lugar de escribir "68187" cadena a OUT.BIN, quiero escribir los 4 bytes int representación de 168.187 a OUT.BIN.

¿Cómo puedo convertir "68187" a 4 bytes int?

+0

se ve como un duplicado, pero ninguna de las respuestas realmente a resolver este problema. –

Respuesta

24

Esto es lo que podría llegar a:

int=65534 
printf "0: %.8x" $int | xxd -r -g0 >>file 

Ahora, dependiendo de endianness es posible que desee cambiar el orden de bytes:

printf "0: %.8x" $int | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 >>file 

Ejemplo (decodificado, por lo que es visible):

printf "0: %.8x" 65534 | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 | xxd 
0000000: feff 0000        .... 

Esto es para sin signo int, si el i int s firmado y el valor es negativo tiene que calcular el complemento de los dos. Matemática simple

+0

Nunca había visto xxd. Y aquí realmente pensé que finalmente había algo que una pequeña cadena de comandos no podía hacer ... :) (Editar: Siento que debo decir que no voté por ti. Solo pensé que debería decir que parecía correcto cuando comencé) – Corbin

+0

no se me pasó por la mente que eras tú, pero oooh maaan, ¿quién votó negativamente? :/ –

+0

Tengo curiosidad por saberlo. Puede que yo sea paranoico, pero juro que últimamente la gente ha recibido un voto muy feliz con respuestas perfectas. – Corbin

4

Usted puede usar la siguiente función para convertir un valor numérico en su correspondiente carácter:

chr() { 
    printf \\$(printf '%03o' $1) 
} 

Usted tiene que convertir los valores de bytes de forma individual, una tras otra en el orden correcto (endianess) para la máquina/arquitectura que usas Así que supongo que un poco de uso de otro lenguaje de scripting que admita salida binaria haría el mejor trabajo.

0
echo 'obase=2;'`stat -c %s in.txt` | bc > out.bin 
2

ver si esto funciona para usted

perl -e "print pack('L',`stat -c %s in.txt`)">>out.bin 
Cuestiones relacionadas