Base64でデコードされた文字列を変数に割り当てると、0x00が削除されるのはなぜですか?

Base64でデコードされた文字列を変数に割り当てると、0x00が削除されるのはなぜですか?

私はMacを使用しています。 BashはBase64文字列をデコードしてから16進値を出力しようとします。コマンドを使用してbase64 -d変数に割り当てています。

myText='YYN29+2wV2XRAHymIyhgytWuqY4atgHnIUFfXA7FPOA='
myTextBytes=$(echo -n "$myText" | base64 --decode)
echo -n $myTextBytes | xxd -p -c 99999

上記のスクリプトの出力は次のとおりです。

618376f7edb05765d17ca6232860cad5aea98e1ab601e721415f5c0ec53ce0

ただし、次のコマンドを直接実行すると:

echo -n "$myText" | base64 --decode | xxd -p -c 100000

私は得る:

618376f7edb05765d1007ca6232860cad5aea98e1ab601e721415f5c0ec53ce0

私も試してみて、openssl enc -base64同じ結果を得ました。つまり、00変数に代入すると削除されます。00変数に割り当てるときはどのように保持しますか?

ベストアンサー1

これは、2つの0x30文字(ASCII "0")で構成される文字列の "00"ではなく、NUL文字0x00です。デコードコマンドの出力をまたはにインポートすると、od -aこの内容が表示されますod -x

Bashのコマンド置換処理(例:)はvar1=$( command )NUL / 0x00文字を削除します。ただし、Bash 4.4以降では警告も印刷されます。 NULバイトを処理できないことは、ほとんどのシェルの制限であり、zshは例外です。しかし、まだ影響を受けるzshコマンドの引数に含まれる0x00文字を渡すのに問題があります(zshの問題ではなく、コマンドへのexec()シリーズ呼び出しの問題であるため)。

Perl、Python、Rubyなどの他の言語に切り替えたくない場合は、zshを使用することをお勧めします。

おすすめ記事