base64 编码给出了模棱两可的结果

Jar*_*win 17 command-line

我正在(从终端)编码到 base64。但我猜这些命令没有正确执行。

$ echo 123456789 | base64
MTIzNDU2Nzg5Cg==
Run Code Online (Sandbox Code Playgroud)

然后当我在base64encode上做同样的事情时,我得到了这个结果

MTIzNDU2Nzg5
Run Code Online (Sandbox Code Playgroud)

我想可能echo也被编码了所以我跑了

$ echo | base64
Cg==
Run Code Online (Sandbox Code Playgroud)

我想我是对的,但这在另一个例子中也没有帮助:

$ echo qwertyuiop | base64
cXdlcnR5dWlvcAo=
Run Code Online (Sandbox Code Playgroud)

当使用base64encode对其进行编码时,结果是

cXdlcnR5dWlvcA==
Run Code Online (Sandbox Code Playgroud)

不出所料,我接受了 base64encode 的结果(在 SMTP 中)

那么,我在这里错过了什么?以及如何将字符串或数字成功转换为 base64?

A.B*_*.B. 39

答案很简单。和

echo 123456789 | base64
Run Code Online (Sandbox Code Playgroud)

或者

echo qwertyuiop | base64
Run Code Online (Sandbox Code Playgroud)

你总是有一个尾随换行符。


通过使用命令的n开关来避免这种行为echo

% echo -n qwertyuiop | base64
cXdlcnR5dWlvcA==
Run Code Online (Sandbox Code Playgroud)

或使用 printf

% printf qwertyuiop | base64
cXdlcnR5dWlvcA==
Run Code Online (Sandbox Code Playgroud)

如您所见,它与base64encode返回的结果相同。


正如@AndreaCorbellini在评论中所说

Base64 为每 3 个输入字节产生 4 个字节的输出,因此输入字节和输出字节之间永远不会有 1:1 的对应关系。这意味着一个新行可能最终以不同的方式被编码,这取决于它前后的字节。

  • @Jarwin:base64 每 3 个输入字节产生 4 个字节的输出,因此输入字节和输出字节之间永远不会有 1:1 的对应关系。这意味着一个新行可能最终以不同的方式被编码,这取决于它前后的字节。 (8认同)