![套餐](https://linux22.com/image/136549/%E5%A5%97%E9%A4%90.png)
有没有一个工具可以在 bash 中执行此操作?
答案1
套餐
是的,有几个。套餐coreutils
(debian 中默认安装)两者都包含32进制和64位基数。他们可以编码或解码:
$ printf '%s' "abc" | base64
YWJj
$ printf '%s' "abc" | base64 | base64 -d
abc
了解使用 echo 可能会添加一个尾随新行,这将更改生成的 Base64 编码字符串:
$ echo "abc" | base64
YWJjCg==
还有其他软件包在 packagesbasez
和中也有类似的工具openssl
。后者通常也是默认安装的,而前者则不是。
$ printf '%s' "abc" | openssl base64
YWJj
编码
源字符串以任何语言环境(代码页)进行编码与 base64 编码无关。 Base64 程序对字节进行编码,而不是字符。
$ printf '%s' "éäìǫ" | base64 | base64 -d
éäìǫ
在任何系统上都可以完全相同地工作。好吧,在任何理智的系统中,echo "éäìǫ"
也会éäìǫ
在命令行上打印。
当然,如果源字符串在一个系统中编码,然后在具有不同语言环境的系统中解码,那么您很可能会得到一个莫吉巴克细绳。那不是base64要解决的问题,而是通过改变字符串的编码来解决的问题。可能与iconv
。
$ echo -n "Москва" | base64 # in a utf8 locale
0JzQvtGB0LrQstCw
但是,在使用 iso889-5 的西里尔语语言环境中(可能是 ru_RU.ISO-8859-5,还有其他使用西里尔语的语言):
$ echo "0JzQvtGB0LrQstCw" | base64 -d
ааОбаКаВаА
$ echo "0JzQvtGB0LrQstCw" | base64 -d | iconv -f utf8 -t iso8859-5
Москва