【问题标题】:unpack() without for loopunpack() 没有 for 循环
【发布时间】:2017-04-05 14:24:31
【问题描述】:

在 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-&gt;{_raw} 只是一个带有二进制数据的字符串。

现在的问题是,是否有更好(=更有效)/更好的方法来使用 map() 或类似方法来执行此操作,而不需要 for 循环?

我尝试了以下方法:

my @BB = map { unpack('C', $_) } substr($thing->{_raw}, $lenOverHead);

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

【问题讨论】:

    标签: perl byte unpack


    【解决方案1】:

    我想你会去

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

    【讨论】:

    • 感谢您提供多种解决方案并在此处解释可用的选择
    • 如果字符数在字符前面,甚至还有n/C
    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多