没有for循环的unpack()

unpack() without for loop

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

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

我想你打算

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