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