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
生成代码(如先前回答中所建议的那样)是一种可怕的做法。
最终我的目标是将数据的 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
生成代码(如先前回答中所建议的那样)是一种可怕的做法。