ddでいくつかのトリックを試しています。私は "header"という変数に16進値を格納してddにパイプすることができると思いました。
変数のない最初のステップは次のとおりです。
$ echo -ne "\x36\xc9\xda\x00\xb4" |dd of=hex
$ hd hex
00000000 36 c9 da 00 b4 |6....|
00000005
その後、私はこれを試しました:
$ header=$(echo -ne "\x36\xc9\xda\x00\xb4")
$ echo -n $header | hd
00000000 36 c9 da b4 |6...|
00000004
ご覧のとおり、変数の\x00
値を失いました$header
。この行動の説明がある人はいますか?これが私を狂わせます。
ベストアンサー1
Bash は終端のためにヌルバイトを予約する C スタイル文字列を使用するので、文字列にヌルバイトを格納することはできません。したがって、 Bash が途中で保存する必要なく、null バイトを含むシーケンスを単純にパイプするようにスクリプトを再構築する必要があります。たとえば、次のようにできます。
printf "\x36\xc9\xda\x00\xb4" | hd
ところで、他の多くの簡単なタスクにはecho
Bashを使用できます。printf
あるいは、リンクの代わりに一時ファイルを使用することもできます。
printf "\x36\xc9\xda\x00\xb4" > /tmp/mysequence
hd /tmp/mysequence
もちろん、ファイルが/tmp/mysequence
すでに存在する可能性があるという問題があります。これで一時ファイルを作成し、そのパスを文字列として保存する必要があります。
または、プロセス置換を使用してこれを回避できます。
hd <(printf "\x36\xc9\xda\x00\xb4")
演算子は、最初の引数として受け取る<(command)
ファイルシステムに名前付きパイプを生成します。パイプを開いて読みます。command
hd
ほぼ他のファイルと同じです。ここで詳細を読むことができます。https://unix.stackexchange.com/a/17117/136742。