Bashは変数に16進値0x00を格納できません。

Bashは変数に16進値0x00を格納できません。

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

ところで、他の多くの簡単なタスクにはechoBashを使用できます。printf

あるいは、リンクの代わりに一時ファイルを使用することもできます。

printf "\x36\xc9\xda\x00\xb4" > /tmp/mysequence
hd /tmp/mysequence

もちろん、ファイルが/tmp/mysequenceすでに存在する可能性があるという問題があります。これで一時ファイルを作成し、そのパスを文字列として保存する必要があります。

または、プロセス置換を使用してこれを回避できます。

hd <(printf "\x36\xc9\xda\x00\xb4")

演算子は、最初の引数として受け取る<(command)ファイルシステムに名前付きパイプを生成します。パイプを開いて読みます。commandhdほぼ他のファイルと同じです。ここで詳細を読むことができます。https://unix.stackexchange.com/a/17117/136742

おすすめ記事