unpack()没有for循环

时间:2017-04-05 14:24:31

标签: perl byte unpack

在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);

但当然它只解包第一个字节,而不是所有字节....

1 个答案:

答案 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);