Bash 中的字节数组(可能包含特殊字符)

Byte array (may contain special character) in Bash

使用来自 Bash 的 base64 解码消息(可能包含特殊字符)。保存到文件将产生 48 字节的数据。然而,如果将它传递给一个变量,它就变成了一个 41 字节的字符串。我相信这是由 Bash 处理特殊字符 (^@) 的方式引起的。

例如,

meow_bash=`printf $variable | base64 --decode`
echo ${#meow_bash}  # return 41

printf $variable | base64 --decode > meow
wc -c meow # return 48

现在,由于数据的敏感性,我不想将数组保存到文件中。我还需要使用 shell 脚本来完成它。有没有办法让我用bash/sh顺利通过呢?

请学习引用你的扩展:使用 printf "$variable",而不是 printf $variable

最简单的原因是 c 将变量定义为以零字节结尾。
因此 c 字符串不能包含零字节。
Bash(用 c 编写),静默删除 variables.

中的任何零值

但可以在流(管道等)中使用零字节。

简单的解决方法是不将值(解码后)存储在变量中。

另请注意,当以 base64 编码存储时,变量可能包含任何字节值。

因此,可以为变量分配安全 base64 编码值:

使用管道中的变量值擦除无字节:

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2"
$ printf '%s' "$variable" | base64 --decode | wc -c
18

即:流可以包含零值字节。

但是将解码后的值赋给一个变量:

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2"
$ meow_bash="$(printf '%s' "$variable" | base64 --decode)"
$ printf '%s' "$meow_bash" | wc -c
15
$ echo "${#meow_bash}"
15

变量$meow_bash丢失了3个零字节。