在 CentOS 7 上对二进制文件进行 Base64 编码的正确方法是什么?

在 CentOS 7 上对二进制文件进行 Base64 编码的正确方法是什么?

我正在使用带有 bash shell 的 CentOS 7。我认为对二进制文件进行 Base64 编码会很简单

[rails@server lib]$ cat mybinary.file | base64 > /tmp/output.base64

但是,我注意到当我查看文件长度时,它不是四的倍数

[rails@server lib]$ ls -al /tmp/output.base64 
-rw-rw-r-- 1 rails rails 92935 May 31 15:50 /tmp/output.base64

我不知道我所做的是否有效,但是当我尝试使用 JS 库解码文件时,我收到一个错误,抱怨字符串长度不是四的倍数,所以我想知道我上面所做的是否正确,或者是否有其他方法可以做到这一点。

答案1

$ echo foo |base64 
Zm9vCg==
$ echo foo |base64 |wc -c
9

请注意 输出中的尾随换行符base64,它是此处的第九个字符。

对于较长的输入,它将生成不止一行,因为默认情况下它每 76 个字符换行一次输出。您可以使用base64 -w0或通过管道输出来禁用换行(包括最后的换行符)tr -d '\n'

答案2

base64为中等长度的字符串写入多行,因此您必须从文件大小中扣除正确的换行数。在某些系统上,该实用程序可能会写入 DOS 文本文件(不是使用base64GNU coreutils 的,而是使用来自 GNU coreutils 的实现)福尔米实验室在 BSD 系统上很常见),在这种情况下,您必须每行扣除 2 个字节才能获得编码字符串的长度。


回答评论中的问题:“如何在没有任何新的留置权或其他垃圾的情况下获得原始的 Base64 字符串?只是 Base64 字符串?”

base64在每 76 个字符后插入换行符,因为 76 个字符是 MIME 编码文本行的最大长度(并且 Base 64 最常用于为电子邮件创建 Base 64 内容传输编码)。

如果您想删除这些换行符:

base64 filename | tr -d '\n\r' >outfilename

通过base64GNU coreutils,您可以使用

base64 -w0 filename >outfilename

答案3

根据手册:

SYNOPSIS
       base64 [OPTION]... [FILE]

DESCRIPTION
       Base64 encode or decode FILE, or standard input, to standard output.

       With no FILE, or when FILE is -, read standard input.

听起来你所做的事情是正确的,但我宁愿cat建议类似 的东西,而不是调用无用的用途base64 file > file.b64

相关内容