【问题标题】:perl: How to decode hex data to integer, string?perl:如何将十六进制数据解码为整数、字符串?
【发布时间】:2010-12-04 23:54:41
【问题描述】:

支持我有一些使用 c 代码打印的十六进制原始数据,格式如“%02X”。
所以它们看起来像:

\x00\x20\x00\x10\xfd\x02\x10\x00\x00\x00\x00\x20\xff\x02\x10\x00\x00\x00\x00\x00 \x05\x00\x011\x00\x01\x00\n\x00\x0240

我想按照以下格式对它们进行解码:
前两个字节十六进制“\x00\x20”应解码为 ushort:
以下两个 B 十六进制“\x00\x10”应解码为 ushort:
以下 8B 十六进制“\xfd\x02\x10\x00\x00\x00\x00\x20”应编码为 64 位。
下面的8B十六进制“\xff\x02\x10\x00\x00\x00\x00`\x00”应该编码为64位;
以下 3 Byte Hex 应解码为 3 char。
....

如何在 perl 中实现解码
(顺便说一句,我不明白为什么每个十六进制之间都有反斜杠,应该如何打印十六进制)?

【问题讨论】:

    标签: perl


    【解决方案1】:

    s{\\x(..)}{chr hex $1}eg; 用于单个字节。 或者只是unpack("v", "\x00\x20");(详见解包函数)。

    【讨论】:

    • #!/usr/bin/perl -w $_ = "\x61\x62"; s{\\x(..)}{chr 十六进制 $1} 例如;打印“方法1:$_\n”; $str2 = unpack("v", "\x61\x62");打印 "approach2: $str2\n";
    • 答案是:bash-3.00# ./hex2str.pl approach1:ab approach2:25185
    • 确实如此。这完全取决于您想要使用哪种方法。有一天你说 ushort(Perl 没有“shorts” - “\x61\x62” 是一个字符串,“ab” 是另一个字符串,25185 是一个数字,通常容量为 int),所以使用方法 2 ;另一个你说“hex2str”,所以使用 appoach 1。
    【解决方案2】:
    1. 解码数据:
      • s/\\x(..)/chr hex $1/eg/;
      • 更好的是,假设您可以控制生成输入的 C 代码,首先让它输出二进制数据并完全避免这一步。
    2. 使用unpack 解码组件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-07
      • 2012-08-29
      • 1970-01-01
      • 2015-11-29
      • 2011-04-08
      • 2023-03-25
      • 2014-03-19
      相关资源
      最近更新 更多