为什么将 Base64 解码的字符串分配给变量时删除 0x00

为什么将 Base64 解码的字符串分配给变量时删除 0x00

我使用的是 Mac。在 Bash 中,我尝试解码 Base64 字符串,然后尝试打印十六进制值。我正在使用base64 -d命令,然后将其分配给变量。

myText='YYN29+2wV2XRAHymIyhgytWuqY4atgHnIUFfXA7FPOA='
myTextBytes=$(echo -n "$myText" | base64 --decode)
echo -n $myTextBytes | xxd -p -c 99999

上述脚本的输出是:

618376f7edb05765d17ca6232860cad5aea98e1ab601e721415f5c0ec53ce0

但是,如果我直接运行以下命令:

echo -n "$myText" | base64 --decode | xxd -p -c 100000

我得到:

618376f7edb05765d1007ca6232860cad5aea98e1ab601e721415f5c0ec53ce0

我什至尝试使用openssl enc -base64并得到相同的结果。也就是说,00在分配给变量时被删除。00当我将它分配给变量时如何保留它?

答案1

这不是两个 0x30 字符(ASCII“0”)组成的字符串中的“00”,而是 NUL 字符 0x00。如果将解码命令的输出导入od -a或,就会看到这一点od -x

Bash 对命令替换(如 )的处理var1=$( command )会去除 NUL/0x00 字符。然而,从 Bash 4.4 开始,它还会打印出警告。无法处理 NUL 字节是大多数 shell 的限制,zsh 是一个例外。但是,将参数中嵌入的 0x00 字符传递给 zsh 仍然受到影响的命令存在问题(因为这不是 zsh 中的问题,而是调用命令的 exec() 系列中的问题)。

如果你不想切换到 Perl、Python、Ruby 等其他语言,那么我建议尝试 zsh。

相关内容