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



用base64从Bash解码消息(可能包含特殊字符)。保存到文件将产生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语言编写),静默地删除变量中的任何零值。

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

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

还要注意,当以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个零字节。

最新更新