2012-03-31 13 views
12

Mögliche Duplizieren:
using bash: write bit representation of integer to fileBash: Schreiben integer zu Binärdatei

Ich brauche die Größe einer Datei in eine binäre Datei zu schreiben. Zum Beispiel:

$ stat -c %s in.txt 
68187 

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

Statt zu schreiben „68187“ string out.bin, möchte ich die 4 Byte int Darstellung von 168.187 schreiben out.bin.

Wie kann ich "68187" in 4 Bytes int konvertieren?

+0

es sieht aus wie ein Duplikat, aber keine der Antworten gibt es wirklich dieses Problem lösen. –

Antwort

24

Dies ist, was ich tun konnte:

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

Jetzt je nach endianness Sie die Byte-Reihenfolge tauschen möchten vielleicht:

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

Beispiel (decodiert, so dass es sichtbar):

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

Dies ist für unsigned Int, wenn die Int i s signiert und der Wert ist negativ müssen Sie die Zweiergänzung berechnen. Einfache Mathematik.

+0

Hatte noch nie xxd gesehen. Und hier dachte ich wirklich, dass es endlich etwas gab, was eine kleine Kette von Befehlen nicht tun konnte .... :) (Edit: Ich finde, ich sollte sagen, dass ich dich nicht abgestimmt habe. Ich dachte, ich sollte es sagen, da es richtig erschien als ich kommentierte) – Corbin

+0

Es kam mir nicht in den Sinn, dass du es warst, aber oooh maaan, wer hat das abgelehnt? :/ –

+0

Ich wäre ziemlich neugierig zu wissen. Ich mag paranoid sein, aber ich schwöre in letzter Zeit, dass die Leute sehr glücklich geworden sind, wenn es um perfekte Antworten geht. – Corbin

4

können Sie verwenden, um die folgende Funktion einen numerischen Wert in die entsprechenden Zeichen zu konvertieren:

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

Sie haben individuell den Byte-Wert zu konvertieren, hintereinander in der richtigen Reihenfolge (Endian) für die Maschine/Architektur, die Sie verwenden. Ich denke, ein wenig Gebrauch von einer anderen Skriptsprache, die eine binäre Ausgabe unterstützt, würde den Job am besten erledigen.

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

sehen, ob dies für Sie arbeitet

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