题
我在文件的消息的十六进制转储我想要得到它在阵列中 这样我就可以在其上执行的解码逻辑。结果 我想知道如果这是解析的消息的更简单的方法,其看起来像这样。
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 33 5F 30 33 31 00 00 00结果 00 00 01 28 40 00 00 15 74 65 6C 6F 63 72 64 69结果 74 65 6C 6F 63 72 64 69
注意,数据可以是最大的任何行16个字节。但是,任何行可以包含更少的太字节(最小:1)点击 是否有一个很好的和优雅的方式,而不是在Perl中?
一次读取2个字符解决方案
Perl有一个 hex
操作者执行用于你的解码逻辑。
hex EXPR
hex
解释EXPR作为十六进制字符串并返回对应的值。 (为了可能与任一
0
,0x
,或0b
开始转换字符串,请参见oct
。 )如果省略EXPR,用途$_
。print hex '0xAf'; # prints '175' print hex 'aF'; # same
记住的 split
默认行为砍下了在空白分隔符的字符串,所以例如
$ perl -le '$_ = "a b c"; print for split' a b c
有关的输入的每行,将其分离成十六进制值,该值转换为数字,并 push
它们放到用于以后的处理的阵列。
#! /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
其他提示
我将在时间读取一行,剥离的空白,并使用pack 'H*'
转换它。很难更具体的不知道什么样的“解码逻辑”你想申请。例如,这里有一个版本,其将每个字节为十进制:
while (<>) {
s/\s+//g;
my @bytes = unpack('C*', pack('H*', $_));
print "@bytes\n";
}
从您的示例文件输出:
55 57 48 53 50 52 53 52 59 50 49 54 57 51 52 53
59 50 49 54 57 51 52 54 0 0 1 8 64 0 0 21
108 113 52 52 115 105 109 49 95 51 48 51 49 0 0 0
0 0 1 40 64 0 0 21 116 101 108 99 111 114 100 105
116 101 108 99 111 114 100 105
我想一次读取在两个字符是解析流,其逻辑令牌是两个字符的单位适当方式。
是有一些原因,你认为是丑陋的?
如果你想提取特定序列,你可以做到这一点与空白不敏感的正则表达式。