为何Bash的base64编码结果与PowerShell不同,出现字符替代等号
Base64编码结果差异原因
- 核心差异来源于两个命令处理输入字符串时的末尾换行符差异,和Base64编码本身的规则无关。
PowerShell侧行为
你执行的代码:
$b = [System.Text.Encoding]::UTF8.GetBytes("helloworld") [System.Convert]::ToBase64String($b)
这里"helloworld"是纯文本字符串,没有携带任何额外后缀,编码后总长度为10字节。按照Base64编码规则,每3字节映射为4个可打印字符,不足3字节的部分用=填充:10字节 = 3*3 + 1,剩余1字节需要补2个=,最终输出为aGVsbG93b3JsZA==。
Bash侧行为
你执行的命令:
echo "helloworld" | base64
Bash内置的echo命令默认会在输出的字符串末尾追加换行符\n(ASCII编码为0x0A),所以实际传给base64编码的内容是helloworld\n,总长度为11字节。按照Base64规则:11字节 = 3*3 + 2,剩余2字节只需要补1个=,多出来的换行符改变了编码后最后几位的字符,最终输出为aGVsbG93b3JsZAo=。
验证方法
你可以通过修改参数让两边结果完全一致:
- Bash中关闭echo的自动换行:执行
echo -n "helloworld" | base64,输出结果和PowerShell默认结果完全相同 - PowerShell中给字符串追加换行:执行
[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("helloworldn"))`,输出结果和Bash默认结果完全相同
内容的提问来源于stack exchange,提问作者Giardino
相关产品推荐
相关产品推荐

