perl中的十六进制转储解析

perl中的十六进制转储解析,perl,parsing,hexdump,Perl,Parsing,Hexdump,我有一个十六进制转储的消息在一个文件中,我想得到它的数组 所以我可以对它执行解码逻辑。 我想知道这是否是一种更简单的方式来解析一条类似这样的消息 37 39 30 35 32 34 35 34 3B 32 31 36 39 33 34 35 3B 32 31 36 39 33 34 36 00 00 01 08 40 00 00 15 6C 71 34 34 73 69 6D 31 5F 33 30 33 00 00 00 01 28 40 00 15 74 65 6C 63 6F 72 64

我有一个十六进制转储的消息在一个文件中,我想得到它的数组 所以我可以对它执行解码逻辑。
我想知道这是否是一种更简单的方式来解析一条类似这样的消息

37 39 30 35 32 34 35 34 3B 32 31 36 39 33 34 35
3B 32 31 36 39 33 34 36 00 00 01 08 40 00 00 15
6C 71 34 34 73 69 6D 31 5F 33 30 33 00
00 00 01 28 40 00 15 74 65 6C 63 6F 72 64 69
74 65 6C 63 6F 72 64 69

请注意,任何行上的数据最多可以是16个字节。但任何行也可以包含更少的字节(最小值:1)

在perl中,有没有一种比一次读取两个字符更好、更优雅的方法?

我认为一次读取两个字符是解析逻辑标记为两个字符单元的流的合适方法

你有什么理由认为那很难看吗


如果您试图提取特定序列,可以使用不区分空格的正则表达式进行提取。

我会一次读取一行,去掉空格,然后使用
pack'H*”
对其进行转换。如果不知道您试图应用什么样的“解码逻辑”,就很难更具体。例如,以下是将每个字节转换为十进制的版本:

while (<>) {
  s/\s+//g;
  my @bytes = unpack('C*', pack('H*', $_));
  print "@bytes\n";
}
Perl有一个运算符为您执行解码逻辑

hex EXPR
hex
将EXPR解释为十六进制字符串并返回相应的值。(要转换可能以
0
0x
0b
开头的字符串,请参见。)如果省略EXPR,请使用
$

print hex '0xAf'; # prints '175'
print hex 'aF'; # same
请记住,在空格分隔符处切碎字符串的默认行为,例如

$ perl -le '$_ = "a b c"; print for split' a b c 样本运行:

$ ./sumhex mtanish-input 4196 $./sumhex mtanish输入
4196@mtanish谢谢我很高兴这有帮助。
#! /usr/bin/perl

use warnings;
use strict;

my @values;
while (<>) {
  push @values => map hex($_), split;
}

# for example
my $sum = 0;
$sum += $_ for @values;
print $sum, "\n";
$ ./sumhex mtanish-input 4196