为什么字符串的 base64 包含“\n”?

Tii*_*ina 148 base64

$ echo -n "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407" | base64
YXBmanhraWMtb215dW9id2QzMzk4MDVhazo2MGEwNmNkMmRkZmFkNjEwYjk0OTBkMzU5ZDYwNTQw
Nw==
Run Code Online (Sandbox Code Playgroud)

输出在 之前有一个返回Nw==在 Linux 中生成 base64 的正确方法是什么?

终端截图

Kam*_*ski 254

尝试:

echo -n "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407" | base64 -w 0
Run Code Online (Sandbox Code Playgroud)

来自man base64

-w,--wrap=COLS
COLS字符后换行编码行(默认76)。使用0以禁用自动换行。

76成为默认值的一个可能原因是 Base64 编码提供了一种在电子邮件和 Usenet 帖子中包含二进制文件的方法,该方法旨在供使用 80 个字符宽度的监视器的人类使用。默认为 76 个字符的宽度使该用例更容易。

  • 哦,伙计,我总是通过 `tr` 传递这个信息。很高兴知道有一种“正确的方法”。 (23认同)
  • @Dherik 我*猜测*这是对文本处理工具的礼貌。`base64` 将任意二进制数据编码为文本。期望文本的工具通常一次读取一行并且 [可能无法很好地处理很长的行](https://askubuntu.com/a/716738/693277)。如果`-w 0` 是默认值,那么默认情况下你只会得到一行文本;如果输入很大,则行会非常长。最好是默认包装。我认为选择 `76` 是因为它略小于 `80`,这是 [一种事实上的终端标准](/sf/ask/480407791/)。 (2认同)
  • @Dherik 一个可能的原因是 base64 编码提供了一种在电子邮件和 usenet 帖子中包含二进制文件的方法,该方法旨在供使用 80 个字符宽度的监视器的人类使用。默认为 76 个字符的宽度使该用例更容易。 (2认同)

Sco*_*der 77

这不如 Kamil 在支持-w选项的系统上的回答base64,但对于不可用的情况(例如 Alpine Linux、Arch Linuxinitramfs钩子等),您可以手动处理 base64 的输出:

base64 some_file.txt | tr -d \\n
Run Code Online (Sandbox Code Playgroud)

这是蛮力方法;我没有让程序合作,而是使用tr不分青红皂白地去除标准输出上的每个换行符。

  • 如果有的话,请务必使用锤子。 (3认同)
  • 以下内容对于“纠正”base64 编码值很有用:`echo 'dGVzdAo=' | Base64-d| tr -d \\n | base64` (2认同)