【问题标题】:Perl Pack Unpack on Shell VariablePerl Pack 在 Shell 变量上解包
【发布时间】:2020-03-09 20:07:40
【问题描述】:

最终我的目标是将数据的十六进制转储转换为正确的浮点值。我已经设置了我的 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 变量的值,我将不胜感激。谢谢。

【问题讨论】:

  • 您在 shell 中定义的变量是“本地”变量,而不是“环境”变量,因此%ENV 看不到它。你需要“导出”它,export rawHex=...(或者只是export rawHex,如果它已经设置好了)。现在%ENV 将拥有它。 (或者,您可以将它作为命令行参数或开关传递给您的 Perl 命令行程序)
  • 我试图通过评估:echo $(perl -e 'print $ENV{rawHex}') 来验证变量是否可以通过这种方式访问​​,结果如预期的那样是 0x41000000。
  • 请参阅this post 以获得解释,然后this one(及其链接)也应该很有用
  • (为了完善这些 cmets:你还需要 hex。现在已经在 ikegami 的回答中完成了)

标签: bash shell perl pack unpack


【解决方案1】:
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 产生 数字 10 亿、9000 万、519040。

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

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

-l 会在输出中添加换行符,因此您无需使用echo。如果您实际上没有使用echo,请随意删除l

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

【讨论】:

    【解决方案2】:

    一个可行的解决方案是

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

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

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

    【讨论】:

    • 我曾尝试对此进行排列,但我有一组不必要的括号,并且它没有返回一致的结果。现在我已经删除了括号,它正在工作。谢谢!
    • 如果它解决了你的问题,记得接受我的回答;)
    • 虽然这在技术上是正确的(它会起作用),但我不得不反对“注入”——它将整个(Perl 单行)脚本打开给谁知道什么。还有其他方法可以将 shell 变量传递给程序,一种是 export-ing,它成为一个“环境”变量,可以在 %ENV 中访问
    • Re "单引号之间的变量 ' 不会被计算。",这是一件好事。生成代码不是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2017-09-07
    • 2011-02-27
    • 2015-01-22
    • 2015-07-26
    • 1970-01-01
    • 2016-12-07
    相关资源
    最近更新 更多