在Shell变量上打开Perl Pack

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

为简化所有操作,我将绕过我设法开始工作的代码,我将从以下内容开始:

with

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

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

结果是8,这是我所期望的。

我将很高兴提供有关如何更新Perl表达式以正确解释shell变量值的帮助。谢谢。

sgdtiancai 回答:在Shell变量上打开Perl Pack

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

您发现,您的代码不等同于以下内容:

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

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

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

"0x41000000"$ENV{rawHex}产生 string 0x41000000。另一方面,0x41000000产生 number 十亿,九千万,五十九万四千四十。

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

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

-l会将换行符添加到输出中,因此您无需使用echo。如果您实际上并未使用l

,请随时删除echo

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

,

一个可行的解决方案是

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

您的代码有两个问题。首先是在bash中,单引号'之间的变量将不被评估。这就是为什么我在示例中将单引号和双引号都取反了。

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

本文链接:https://www.f2er.com/3106219.html

大家都在问