首先,我获取一个 base64 编码的字符串并对其进行解码:
local base64_str="OQbb8rXnj/DwvglW018uP/1tqldwiJMbjxBhX7ZqwTw="
echo "${base64_str}" | base64 --decode > foo.txt
二进制文件的大小为 32 字节,基于:wc -c < foo.txt
我使用xxd
将文件中的值编码为十六进制格式:
xxd -p ./foo.txt ./foo.hex.txt
文件 foo.hex.txt 中的十六进制值为:
3906dbf2b5e78ff0f0be0956d35f2e3ffd6daa577088931b8f10615fb66a
c13c
编码哈希文件的大小为 66 字节,使用wc -c < foo.hex.txt
我想将 base64 字符串转换为十六进制,使其保留为 32 字节字符串,以便我可以与 openssl 一起使用 aes-256 密码进行加密和解密。
local iv_hex=$(base64_to_hex "${iv}")
local key_hex=$(base64_to_hex "${key}")
openssl enc -aes-256-ctr -K "${key_hex}" -iv "${iv_hex}" -in "${input_file}" -out "${output_file}"
将小型 base64 编码字符串转换为十六进制
1. 减少分叉
接受的答案确实提供了一个有很多分支的解决方案!我讨厌没用的叉子!
这是我的简短的base64 到十六进制转换器:
为了避免类似 fork 的情况
myVar=$(myFunc args)
,此函数只会填充一个变量,而不会打印出任何内容。然后你可以使用:
请参阅本文底部以了解执行时间比较。
2.纯bash方式:
这不依赖于
xxd
任何base64
安装。(而且无需 fork,比运行 3 个 fork 快得多!如果您打算重复运行此操作,请记住这一点!)来自这个: Bash 脚本 - 将编码的字符串解码为字节数组,在我的网站上:base64decoder.sh.txt,base64decoder.sh,有一个非常小的修改**:
首先准备一个只读数组:
然后
b64ToHex
函数:如果已知bash循环很慢,那么仅对 32 字节进行循环将比运行四个 fork 快得多,而且系统扩展性更低!
从STDIN使用:
从一个论点来看:
分配变量:
然后从,到变量:
注意:这是在没有任何分叉的情况下完成的。
为了好玩:检索原始 base64 字符串,使用 bash V5.1+,您可以:
3. 纯 bash 方式,但使用 bash V5.2+
相同的脚本,但通过使用patsub_replacement和
mapfile
,我可以不使用任何bash循环来完成此操作!4. 执行时间对比
好吧,现在通过重复进行相同的转换来计算执行时间,进行一点比较测试。
我现在有4个功能:
b64toHex
我的版本使用base64
和xxd
b64ToHex
我的纯bash版本(注意上方T
)b64ToHex52
我的纯bash使用 bash 版本 5.2+base64_to_hex
来自接受的答案。这是我的小测试功能:
让我们用一小千个操作来展示:
可能会产生类似这样的结果:
其中
r
实际、:用户、:系统时间和:CPU百分比为:u
s
p
100 * ( u + s ) / r
xxd
和base64
只有两个 fork 甚至会比xxd
、base64
和tr
)。它们是最慢的,而且是的:另外两个 fork 确实占用系统资源。注意:在多核系统上,由于并行化,
user
时间大于时间real
在我的Raspberry-Pi II 型号 B上,我必须将测试减少到 20 个循环。
在我的RPi II上产生了:
xxd -p
\n
输出中可能有字符,因此您需要删除它们:使用您的 base64 字符串作为示例: