2012-03-31 23 views
12

Eventuali duplicati:
using bash: write bit representation of integer to fileBash: scrivere per intero file binario

ho bisogno di scrivere la dimensione di un file in un file binario. Per esempio:

$ stat -c %s in.txt 
68187 

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

Invece di scrivere "68187" stringa OUT.BIN, voglio scrivere l'int rappresentazione 4 byte di 168.187 a OUT.BIN.

Come posso convertire "68187" a 4 byte int?

+0

sembra un duplicato, ma nessuna delle risposte c'è davvero risolvere questo problema. –

risposta

24

Questo è ciò che ho potuto venire con:

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

Ora, a seconda endianness si potrebbe desiderare di scambiare l'ordine dei byte:

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

Esempio (decodificato, quindi è visibile):

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

Questo è per senza firma int, se l'int i s firmato e il valore è negativo devi calcolare il complemento a due. Matematica semplice

+0

Non avevo mai visto xxd. E qui pensavo davvero che alla fine ci fosse qualcosa che una piccola catena di comandi non poteva fare .... :) (Modifica: ho l'impressione che dovrei dichiarare che non ho votato a vuoto. Ho solo pensato che dovrei dire dato che è apparso giusto quando ho commentato) – Corbin

+0

non mi è venuto in mente che eri tu, ma oooh maaan, chi ha svalutato questo? :/ –

+0

Sarei curioso di sapere. Potrei essere paranoico, ma giuro che ultimamente le persone hanno ottenuto voti molto bassi su risposte perfettamente soddisfacenti. – Corbin

4

È possibile utilizzare la seguente funzione per convertire un valore numerico nel suo carattere corrispondente:

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

È necessario convertire i valori di byte singolarmente, uno dopo l'altro nell'ordine corretto (endianess) per la macchina/architettura che usi. Quindi, suppongo, un piccolo uso di un altro linguaggio di scripting che supporti l'output binario faccia il lavoro al meglio.

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

vedere se questo funziona per voi

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