なぜこれが起こり、解決策を知っている人がいますか?
me@box:~$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ" | base64 -di
{"foo":"bar","baz":"bat"}base64: invalid input
答え1
逆にすると、文字列が不完全であることがわかります。
$ echo '{"foo":"bar","baz":"bat"}' | base64
eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQo=
$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQo=" | base64 -di
{"foo":"bar","baz":"bat"}
抜粋入力長を3で割ることができない場合base64エンコーディングにパディングが必要なのはなぜですか?
フィラー文字とは何ですか?
パディング文字は長さの要件を満たすのに役立ちますが、意味はありません。
ただし、パディングは、非常に単純なネットワークプロトコルで発生する可能性があるように、Base64でエンコードされた文字列が個々のシーケンスの長さが失われるように接続される状況で役立ちます。
埋められていない文字列を連結すると、個々のシーケンスの終わりにある奇数バイトに関する情報が失われるため、元のデータを回復できません。ただし、パディングシーケンスを使用すると、あいまいさがなく、シーケンス全体を正確にデコードできます。
答え2
コマンドラインツールは、入力長が4の倍数になるように適切なパディング文字数を選択します。文字列の長さは34文字なので、=
最後にパディングとして2つの記号が必要です。
$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ==" | base64 -di; echo
{"foo":"bar","baz":"bat"}
入力にパディング文字がない場合、結果は実装によって異なります。正しいBase64エンコーディングabcd
は次のとおりですYWJjZA==
。
% echo -n abcd |base64
YWJjZA==
パディング文字を削除してデコードしようとすると、最後の部分は次のようになります。静かに落ちるMacの場合:
% echo 'YWJjZA' |base64 -d
abc
GNU 実装では、出力全体が表示されますが、stderr にエラーメッセージが表示されます。
$ echo 'YWJjZA' |base64 -d
abcdbase64: invalid input
答え3
GNUではbase64 -d
適切なパディングが必要です(入力長は4の倍数でなければなりません)。他のbase64
デコーダはよりスマートであり、パディングは必要ありません(たとえば、Mac / BSDはbase64 -D
パディングを必要としません)。
以下は、文字列を自動的に正しく埋めるbashコマンドですbase64
。これにより、「無効な入力」エラーは発生しません。
str="eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ"
echo "$str"==== | fold -w 4 | sed '$ d' | tr -d '\n' | base64 --decode
説明する:
echo "$str"====
4つの等号を追加してください。fold -w 4
4文字ごとに別々の行に分割sed '$ d'
最後の行を削除する(無関係のパディング)tr -d '\n'
すべての行をリンク