我有一个 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/