2012-03-31 97 views
12

可能重複:
using bash: write bit representation of integer to file擊:寫整數二進制文件

我需要一個文件的大小寫入到一個二進制文件。例如:

$ stat -c %s in.txt 
68187 

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

而不是寫「68187」字符串out.bin,我想寫的168187的4個字節INT表示要out.bin。

如何將「68187」轉換爲4個字節的int?

+0

它看起來像一個重複的,但沒有一個答案真的有解決這個問題。 – 2012-03-31 11:16:03

回答

24

這是我能想出:

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

現在根據字節序你可能希望交換的字節順序:

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

例(解碼,所以它的可見):

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

這是爲無符號的 int,如果int i s signed and value is negative您必須計算二進制補碼。簡單的數學。

+0

從未見過xxd。在這裏,我真的認爲終於有一些命令鏈不能做...... :)(編輯:我覺得我應該說我沒有投票給你,只是覺得我應該說,因爲它看起來是正確的當我評論) – Corbin 2012-03-31 10:47:07

+0

它並沒有跨過我的腦海這是你,但oooh maaan,誰低估了這一點? :/ – 2012-03-31 10:51:51

+0

我會很好奇知道。我可能是偏執狂,但我最近發誓,人們對於完美的答案已經得到了非常不滿的投票。 – Corbin 2012-03-31 10:52:45

4

您可以使用下面的函數來數值轉換成相應的字符:

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

你必須字節值以正確的順序(字節順序)的機器分別進行轉換,之後彼此/你使用的架構。所以我想,使用另一種支持二進制輸出的腳本語言會最好地完成這項工作。

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

看看這對你的作品

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