Bashを使用してバイナリファイルに16進値を書き込む

Bashを使用してバイナリファイルに16進値を書き込む

バイナリファイルに特定の数のゼロを自動的に書き込むには?

私は書く:

#!/bin/bash
for i in {0..127};
do
    echo -e -n "\x00" >> file.bin
done

ただし、Bless 出力ビュー ファイルを使用する2D 65 20 2D 6E 20 5C 78 30 30 0A場合-e -n \x00

答え1

printf携帯性が必要ですそして8進数の文字エスケープをサポートします。

i=0
while [ "$i" -le 127 ]; do
    printf '\000'
    i=$((i+1)) 
done >> file.bin

printfそのように16進エスケープをサポートする必要はありませんが、\x00多くのシェルではサポートされています。)

バラよりなぜprintfがechoより優れているのですか?問題が発生しましたecho

答え2

ファイルが0の場合、明らかなのは次のとおりです。

dd if=/dev/zero of=file.bin bs=1 count=128  

これはシングルバイトの書き込みを行うため、実際には非常に非効率的です。以下を簡単に使用できます。

dd if=/dev/zero of=file.bin bs=128 count=1  

ここでbs' is the 'block size' andcount`はブロックがいくつあるかを示します。いくつかの小さな塊よりも1つの塊として書く方が良いです!

上記のコマンドは次のとおりです。いいえに添付するとfile.bin上書きされます。 1つの方法は次のとおりです。

dd if=/dev/zero bs=128 count=1 >> file.bin  

説明:そうでない場合は、標準出力に書き込み、of=出力ddファイルに追加します。

答え3

  1. printfすべてのパラメータで同じ形式が再利用されます。
  2. この形式は%.0s引数の一部を印刷しません。

これらを組み合わせるとかなり良い結果が得られます

$ printf '\0%.0s' {1..128} >128nulls

128個のnull値。

関連情報