3

我有一串packed 值,这些值是使用以下内容按顺序创建的:

while (...) {
 ...
 $packed .= pack( 'L', $val );
}

在另一个程序中,在我加载之后$packed,我希望找出实际打包了多少个值。我知道在unpacking 之后该怎么做:

my @vals = unpack( 'L*', $packed );
print scalar(@vals);

但真的有必要吗?如果我只关心值的数量,我可以做得更好并跳过unpacking 吗?

4

3 回答 3

7

由于您知道打包值的大小(L是无符号的 32 位 int,或 4 个字节),只需将长度除以大小:

my $count = length($packed) / 4;

如果你不想硬编码大小,你也可以打包一个样本值来计算它。(请注意,Perl 的编译时常量折叠不适用于pack,至少不适用于 5.10.1,因此您只想进行一次计算。)

my $size = length(pack('L', 0));
...
my $count = length($packed) / $size;
于 2010-09-30T21:07:37.033 回答
1

由于L只是 32 位值的组,您可以简单地计算字节数并除以 4。

于 2010-09-30T21:09:13.923 回答
-1
use constant LLength => length(pack("L", 0));
...
print length($packed)/LLength;

检查是否LLength真的恒定:

$ perl -MO=Deparse,-d -e'use constant L => length(pack("L", 0));print L, "\n";'
sub L () { 4 }
use constant ("L", length pack("L", 0));
print 4, "\n";
-e syntax OK
于 2010-10-01T09:23:24.037 回答