在Perl中,我使用unpack()函数将二进制数据解压缩为字节。到目前为止我得到了这个:
my $lenOverHead = 3;
my $lenWithoutOverheads = length($thing->{_raw}) - $lenOverHead;
my @AA;
for (my $i = 0; $i < $lenWithoutOverheads; $i++)
{
push (@AA, unpack('C', substr($thing->{_raw}, $lenOverHead+$i)));
}
请注意,$thing->{_raw}
只是一个包含二进制数据的字符串。
现在的问题是,使用map()
或类似方法做一次更好(更有效)/更好的方法,而不需要for
循环吗?
我尝试了以下内容:
my @BB = map { unpack('C', $_) } substr($thing->{_raw}, $lenOverHead);
但当然它只解包第一个字节,而不是所有字节....
答案 0 :(得分:6)
我认为你要去
my @AA = map { unpack('C', $_) } split //, substr($message, 3);
可以优化成
my @AA = map ord, split //, substr($message, 3);
但我会使用unpack
。诀窍在于您可以使用数字或*
来跟踪类型以指示要提取的数量。
my @AA = unpack('C*', substr($message, 3));
my @AA = unpack('x3 C*', $message);
my ($header, @AA) = unpack('a3 C*', $message);
my ($header, $body) = unpack('a3 a*', $message);
my @AA = unpack('C*', $body);