如何通过命令行对base64进行编码?

Jos*_*osh 325 encoding command-line base64 macos

Mac OS X 中是否有一个终端命令可以对文件或标准输入进行 base64 编码?

Ste*_*lly 338

openssl可以为你做这件事,默认情况下它都安装在 OS X 上;无需安装 darwinports。

$ openssl base64 -in <infile> -out <outfile>
Run Code Online (Sandbox Code Playgroud)

没有-in选项从标准输入读取

  • 使用 `openssl base64 &lt; path/to/file.png | tr -d '\n' | pbcopy` 或`cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy` 跳过写入文件,只需将 base64 编码的输出复制到剪贴板而没有换行符。 (95认同)
  • @mathias 如果你不想要换行符 `openssl base64 [-e] -A` 就可以了。+ @kenny 解码,如果输入最多每 76 个字符没有换行符,包括我刚刚提到的无换行符情况,你需要 `-d -A` 否则你会得到丢失或损坏的数据 * 没有错误消息 * (尽管有一个未决的错误报告可能会导致对此进行修复)。 (13认同)
  • 在 mac 中,对字符串进行 base64 编码:`openssl base64 -e &lt;&lt;&lt; ram` 并解码:`openssl base64 -d &lt;&lt;&lt; cmFtCg==` (10认同)
  • 并使用 `-d` 标志进行解码。 (5认同)
  • @Ram,`openssl base64 -e &lt;&lt;&lt; ram` 实际上编码了 4 个字节,包括一个尾随换行;参见`hexdump &lt;&lt;&lt; ram`。 (2认同)

小智 160

可以更简洁地使用openssl:

echo -n 'input' | openssl base64
Run Code Online (Sandbox Code Playgroud)

[ 必须使用 echo -n -> ,否则将进行编码,包括换行符 ]

或者

openssl base64 <ENTER> [type input] <CTRL+D>
Run Code Online (Sandbox Code Playgroud)

  • 不过,“echo”解决方案会在输入字符串的末尾添加一个 LF(换行符)字符。更好地使用:echo -n 'input' (15认同)
  • 甚至更简洁的`openssl base64 &lt;&lt;&lt; input` (12认同)
  • 或者只使用“base64”而不使用“openssl”。无论哪种方式,我都需要按 Ctrl+D 两次。请注意,@Garret:在 Bash 中,无论是否有 `openssl`、`openssl base64 &lt;&lt;&lt; superuser` 和 `openssl base64 &lt;&lt;&lt; "superuser"` **错误地**产生 `c3VwZXJ1c2VyCg==`,作为“ here string”然后仍然包含换行符!([显然](https://lists.gnu.org/archive/html/bug-bash/2015-02/msg00096.html) 不仅在 Bash 中,而且在 zsh、ksh 和 yash 中。参见 `hexdump &lt;&lt; &lt;超级用户`。Base64结果应该是`c3VwZXJ1c2Vy`。) (3认同)
  • 您可以使用 `printf` 代替 `echo -n` (2认同)

小智 75

尝试使用:

base64 -i <in-file> -o <outfile>
Run Code Online (Sandbox Code Playgroud)

默认情况下,它应该在 OS X 上可用。

  • 添加 `--decode` 将过程从 base64 反转为正常。 (2认同)
  • 这对 SVG 编码更好,因为它会创建一行。这比“openssl base64”的输出更清晰。谢谢! (2认同)

小智 55

base64 命令在我的 OS X 10.9.4 上默认可用。

您可以使用base64 <<< stringandbase64 -D <<< string在终端中对字符串进行编码和解码,或者使用base64 -in fileandbase64 -D -in file对文件进行编码和解码。

  • 请注意`base64 &lt;&lt;&lt; cat` 等价于`echo cat|base64`,而不是`echo -n cat|base64`。基本上自动换行将被添加到 base64 编码的字符串中,这可能不是您想要的。 (4认同)

pat*_*ckS 51

在 macOS 上我总是使用:

echo -n "STRING" | base64

-n 是为了避免在行尾出现换行符。


ken*_*orb 14

由于 Python 是默认随 OS X 提供的,因此您可以按如下方式使用它:

$ echo FOO | python -m base64
Rk9PCg==
$ echo Rk9PCg== | python -m base64 -d
FOO
Run Code Online (Sandbox Code Playgroud)

或者coreutils通过Brew ( brew install coreutils)安装,它将提供base64命令:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
Run Code Online (Sandbox Code Playgroud)


小智 6

在速度方面,我会使用 openssl,然后是 perl,然后是 uuencode。在可移植性方面,我将使用 uuencode,然后是 Perl,然后是 openssl(如果您关心在尽可能多的其他 UNIX 类股票平台上重用代码)。但要小心,因为并非所有 UNIX 变体都支持 -m 开关(iirc AIX 支持,HP/UX 支持,Solaris 不支持)。

$ time perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' \
> out.jpg 1>filename.b64
real    0m0.025s

$ time uuencode -m -o filename.b64 out.jpg filename_when_uudecoded.txt
real    0m0.051s

$  time openssl base64 -in out.jpg -out filename.b64 
real    0m0.017s
Run Code Online (Sandbox Code Playgroud)

按规定使用-m开关UUENCODE file_in.txt每BASE64 RFC1521和(解码时filename_when_uudecoded.txt作为默认的文件名)将其写入filename.b64:

uuencode -m -o filename.b64 file_in.txt filename_when_uudecoded.txt
Run Code Online (Sandbox Code Playgroud)

标准输入示例:

cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 6

您还可以将其直接通过管道传输到剪贴板(至少在 mac 上):

openssl base64 -in [filename] | pbcopy


ccp*_*zza 5

Python

现在所有的 Mac 都预装了 Python。

在终端运行python(或ipython)。

编码文件:

 base64data = open('myfile.jpg','rb').read().encode('base64')
 open('myfile.txt','w').write(base64data)
Run Code Online (Sandbox Code Playgroud)

解码文件:

data = open('myfile.txt').read().decode('base64')
open('myfile.jpg','wb').write(data)
Run Code Online (Sandbox Code Playgroud)

当然,这两个操作都可以转换为 oneliner,但这样可读性更好。

开放式SSL

## encode to base64 (on OSX use `-output`)
openssl base64 -in myfile.jpg -output myfile.jpg.b64

## encode to base64 (on Linux use `-out`)
openssl base64 -in myfile.jpg -out myfile.jpg.b64


## decode from base64 (on OSX `-output` should be used)
openssl base64 -d -in myfile.jpg.b64 -output myfile.jpg

## decode from base64 (on Linux `-out` should be used)
openssl base64 -d -in myfile.jpg.b64 -out myfile.jpg
Run Code Online (Sandbox Code Playgroud)

省略-out/-output... filename将打印到标准输出。

base64

OSX 和 Ubuntu 中都存在另一个 ootb 实用程序:

## encode to base64
base64 < myfile.jpg > myfile.jpg.b64

## decode from base64 (OSX) (note the uppercase 'D')
base64 -D < myfile.jpg.b64 > myfile.jpg

## decode from base64 (Linux) (note the lowercase 'd')
base64 -d < myfile.jpg.b64 > myfile.jpg
Run Code Online (Sandbox Code Playgroud)