Perl Pack 在 Shell 变量上解压

Perl Pack Unpack on Shell Variable

最终我的目标是将数据的 hexdump 转换为正确的浮点值。我已经设置了我的 shell 脚本来隔离我需要查看的各个十六进制值,并以正确的顺序排列它们以进行一点 Endian 浮点数转换。

为了简化一切,我将绕过我设法开始工作的代码,我将从以下内容开始:

rawHex=0x41000000
echo $(perl -e 'print unpack "f", pack "L", $ENV{rawHex}')

当我执行此代码时,结果为 0。但是如果我执行代码而不尝试提取 shell 变量的值:

echo $(perl -e 'print unpack "f", pack "L", 0x41000000')

结果是8,符合我的预期。

对于如何更新我的 Perl 表达式以正确解释 shell 变量的值的任何帮助,我将不胜感激。谢谢

一个可行的解决方案是

rawHex=0x41000000
echo $(perl -e "print unpack 'f', pack 'L', ${rawHex}")

您的代码有两个问题。首先是在 bash 中,单引号 ' 之间的变量不会被计算。这就是为什么我在您的示例中将单引号和双引号倒过来的原因。

第二个问题是ENV的使用。我不确定你为什么要用它,但你不需要它。

export rawHex=0x41000000
perl -le'print unpack "f", pack "L", hex($ENV{rawHex})'

如您所见,您的代码不等同于以下代码:

perl -e 'print unpack "f", pack "L", 0x41000000'

您的代码等同于以下内容:

perl -e 'print unpack "f", pack "L", "0x41000000"'

"0x41000000" 一样,$ENV{rawHex} 生成 字符串 0x41000000。另一方面,0x41000000产生十亿、九千万、五万一万九千零四十。

要将数字的十六进制表示形式转换为它所代表的数字,请使用 hex。只需将 $ENV{rawHex} 替换为 hex($ENV{rawHex}).

export rawHex=0x41000000
perl -le'print unpack "f", pack "L", hex($ENV{rawHex})'

-l 会在输出中添加一个换行符,因此您不需要使用 echo。如果您实际上没有使用 echo

,请随意删除 l

生成代码(如先前回答中所建议的那样)是一种可怕的做法。