perl - 如何解析在 Perl 中解压缩的以空格分隔的 STDIN 十六进制字符串?

标签 perl parsing unpack

我有一个 Java 程序,它以空格分隔的十六进制格式输出通过网络接收的 16 字节的原始数据包。由于我不想更改该代码,因此我将结果传送到 Perl 脚本,理论上,该脚本可以简单地 unpack这来自 STDIN成可识别的变量。以下是我的 Perl 文件的行输入示例:

FF FF 09 7D 10 01 07 01 00 02 00 1D 00 00 00 00 00 06 00 07 00
|--垃圾-----|c--|c--|int---|int---|int---|int---|int---|int---|int- --|

(c 代表字符/字节,int 代表 16 位整数变量)

我最初想使用 unpack将每个输入行干净地分成我需要的变量。但是,由于字符串中的空格分隔,我不知道如何处理它(我可以使用 'A' 作为模板,但我不妨只使用 split!)

有没有一种优雅的使用方式 unpack() ?我不是 Perl 高手,但另一种方法是,正如我之前建议的那样,使用 split然后手动将每个十六进制转换为一个字节,然后使用位操作和掩码来获得我想要的。任何其他建议(如果 unpack 不能挽救这一天)?

最佳答案

假设这些整数是大端顺序,使用

#! /usr/bin/perl

use warnings;
use strict;

# for demo only
*ARGV = *DATA;

while (<>) {
  my @fields = unpack "x5C2n7",
               pack "C*",
               map hex, split;

  print "[", join("][" => @fields), "]\n";
}

__DATA__
FF FF 09 7D 10 01 07 01 00 02 00 1D 00 00 00 00 00 06 00 07 00

它首先根据它们的值打包字节( C* )。 unpack模板有以下几个部分:
  • x5跳过五个字节
  • C2解码两个 unsigned char
  • n7解码七个 16 位大端无符号整数

  • 输出:

    $ ./dump-packets
    [1][7][256][512][7424][0][0][1536][1792]

    关于perl - 如何解析在 Perl 中解压缩的以空格分隔的 STDIN 十六进制字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2180390/

    相关文章:

    perl 101 - 迭代散列导致永无止境的循环

    html - 使用 CGI::Application 获取 latin1 而不是 UTF-8

    java - 如何在java中将时间戳字符串转换为日期

    json - 获取 JSON 文件中的最后一个元素

    perl - Perl 中的引用是如何工作的

    java - 如何用 Jackson 解析 xmlElements?

    python - C 中的 "Unpacking"

    perl - 你能解释一下我从解压中得到的信息吗?

    python - 通过将三个列表的元素添加在一起来创建新列表 - 关联错误(PYTHON)

    Perl,$|++ 有什么作用?