我正在使用带有 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 文本文件(不是使用base64
GNU coreutils 的,而是使用来自 GNU coreutils 的实现)福尔米实验室在 BSD 系统上很常见),在这种情况下,您必须每行扣除 2 个字节才能获得编码字符串的长度。
回答评论中的问题:“如何在没有任何新的留置权或其他垃圾的情况下获得原始的 Base64 字符串?只是 Base64 字符串?”
base64
在每 76 个字符后插入换行符,因为 76 个字符是 MIME 编码文本行的最大长度(并且 Base 64 最常用于为电子邮件创建 Base 64 内容传输编码)。
如果您想删除这些换行符:
base64 filename | tr -d '\n\r' >outfilename
通过base64
GNU 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
。