base64 -d 解码,但输入无效

shw*_*eph 10 linux bash echo base64

有谁知道为什么会发生这种情况以及如何解决它?

me@box:~$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ" | base64 -di
{"foo":"bar","baz":"bat"}base64: invalid input

Run Code Online (Sandbox Code Playgroud)

sch*_*ity 17

如果你反过来做,你会注意到字符串不完整:

$ echo '{"foo":"bar","baz":"bat"}' | base64
eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQo=

$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQo=" | base64 -di
{"foo":"bar","baz":"bat"}
Run Code Online (Sandbox Code Playgroud)

如果输入长度不能被 3 整除为什么 base64 编码需要填充?

什么是填充字符?

填充字符有助于满足长度要求并且没有任何意义。

但是,填充在 base64 编码字符串以丢失单个序列长度的方式连接的情况下很有用,例如,在非常简单的网络协议中可能会发生这种情况。

如果连接未填充的字符串,则无法恢复原始数据,因为有关每个单独序列末尾的奇数字节数的信息丢失了。但是,如果使用填充序列,则没有歧义,并且可以正确解码整个序列。

  • 请注意,您在此处使用的字符串与原始字符串略有不同,因为 `echo` 添加了一个尾随换行符。没有它的原始字符串将被正确填充为 `...ifQ==`。在这种情况下,两个版本都需要填充。 (13认同)
  • ```echo -n '{"foo":"bar","baz":"bat"}' | base64 eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ==``` (3认同)

ilk*_*chu 13

命令行工具对填充字符的存在很挑剔。该字符串有 34 个字符长,因此=末尾应该有两个符号作为填充。

$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ==" | base64 -di; echo
{"foo":"bar","baz":"bat"}
Run Code Online (Sandbox Code Playgroud)


wis*_*cky 8

GNUbase64 -d需要适当的填充(输入长度​​必须是 4 的倍数)。其他base64解码器可能更智能并且不需要填充(例如Mac/BSDbase64 -D不需要填充)。

这是一个可以自动base64正确填充字符串的 bash 命令。这样您就不会收到“无效输入”错误。

str="eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ"

echo "$str"==== | fold -w 4 | sed '$ d' | tr -d '\n' | base64 --decode
Run Code Online (Sandbox Code Playgroud)

解释:

  • echo "$str"====添加 4 个等号
  • fold -w 4将每 4 个字符分成单独的行
  • sed '$ d'删除最后一行(无关的填充)
  • tr -d '\n'连接所有行