我在文件的消息的十六进制转储我想要得到它在阵列中 这样我就可以在其上执行的解码逻辑。结果 我想知道如果这是解析的消息的更简单的方法,其看起来像这样。

  

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作为十六进制字符串并返回对应的值。 (为了可能与任一00x,或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

我想一次读取在两个字符是解析流,其逻辑令牌是两个字符的单位适当方式。

是有一些原因,你认为是丑陋的?

如果你想提取特定序列,你可以做到这一点与空白不敏感的正则表达式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top