我使用的是 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。