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 编码字符串以丢失单个序列长度的方式连接的情况下很有用,例如,在非常简单的网络协议中可能会发生这种情况。
如果连接未填充的字符串,则无法恢复原始数据,因为有关每个单独序列末尾的奇数字节数的信息丢失了。但是,如果使用填充序列,则没有歧义,并且可以正确解码整个序列。
ilk*_*chu 13
命令行工具对填充字符的存在很挑剔。该字符串有 34 个字符长,因此=末尾应该有两个符号作为填充。
$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ==" | base64 -di; echo
{"foo":"bar","baz":"bat"}
Run Code Online (Sandbox Code Playgroud)
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'连接所有行| 归档时间: |
|
| 查看次数: |
3463 次 |
| 最近记录: |