📜  无效的 base64 编码字符串:数据字符数 (221) 不能是 1 大于 4 的倍数 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 14:55:05.577000             🧑  作者: Mango

无效的 base64 编码字符串:数据字符数 (221) 不能是 1 大于 4 的倍数

如果你曾经遇到过 无效的 base64 编码字符串:数据字符数 (221) 不能是 1 大于 4 的倍数 的错误提示,那么恭喜你,至少代表你在使用 base64 编码相关的程序或工具。

什么是 base64 编码?

base64 编码是一种用于将二进制数据转换成 ASCII 字符串的编码方式。它是一种可逆的编码方式,可以将任意二进制数据编码成 ASCII 字符串,便于在邮件、URL、JSON 等场景下传输。base64 编码的字符串长度一般为原始数据长度的大约 4/3 倍。

为什么会出现该错误?

在使用 base64 编码字符串的时候,需要注意的是,对于一个长度为 n 的字符串,进行 base64 编码后,其结果字符串长度一般为 ceil(n/3) x 4,即如果结果字符串长度不是 4 的倍数,那么必须进行填充。所谓填充,就是在结果字符串末尾添加 1 个或 2 个等号字符(=),使得结果字符串长度变为 4 的倍数。

而对于 无效的 base64 编码字符串:数据字符数 (221) 不能是 1 大于 4 的倍数 这个错误,实际上是在解码一个 base64 编码字符串时出现的。当一个 base64 编码字符串的长度既不是 4 的倍数,且最后一个字符不是等号(=)时,我们就会得到这个错误。

如何解决该错误?

解决该错误的方法很简单,只需要在解码前,根据上文所述的规则,对 base64 编码字符串进行填充即可。如果结果字符串长度已经是 4 的倍数,则不需要填充。如果结果字符串长度是 4 的倍数,但最后一个字符是等号,那么也需要进行填充。

下面是一个具体的 Bash 代码示例,可以对 base64 编码字符串进行填充,然后进行解码:

#!/bin/bash

# 要解码的 base64 编码字符串
base64_str="SGVsbG8gV29ybGQh"

# 计算填充后的字符串长度
len=${#base64_str}
mod=$(($len%4))
if [ $mod -eq 2 ]; then
    base64_str="$base64_str=="
elif [ $mod -eq 3 ]; then
    base64_str="$base64_str="
fi

# 解码 base64 编码字符串
decoded_str=$(echo "$base64_str" | base64 -d)

# 输出解码后的字符串
echo $decoded_str

在这段代码中,我们首先计算了 base64 编码字符串的长度,并根据长度和填充规则进行填充。然后使用 base64 -d 命令解码填充后的字符串,并输出解码后的字符串。

通过上述代码示例,我们可以避免出现 无效的 base64 编码字符串:数据字符数 (221) 不能是 1 大于 4 的倍数 的错误,以及其他相关问题。