代码之家  ›  专栏  ›  技术社区  ›  AliA

pack函数不能打包超过5个字节

  •  1
  • AliA  · 技术社区  · 1 年前

    当我尝试使用“H2”模板打包超过5个字节时,我可以正确地解压缩前5个字节,但其余的都已损坏。请考虑以下脚本:

    my $a = "11:22:33:44:55:66";
    my @b = split /:/, $a;
    my @c = map {hex($_)} @b;
    
    my $d = pack( 'H2'x6, @c );
    
    my @e = unpack( 'H2'x6, $d);
    foreach (@e) {
        printf("%02x:", $_);
    }
    

    输出 : 11:22:33:44:55:0a:

    最后一个字节输出为“0a”,而不是我所期望的“66”。

    1 回复  |  直到 1 年前
        1
  •  2
  •   choroba    1 年前

    使用 Data::Dumper 查看变量包含哪些内容:

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    use Data::Dumper;
    
    my $A = "11:22:33:44:55:66";  # $a is a special variable, don't use it.
    my @b = split /:/, $A;
    warn Dumper \@b;
    
    my @c = map hex, @b;
    warn Dumper \@c;
    
    my $d = pack 'H2' x 6, @c;
    {   local $Data::Dumper::Useqq = 1;
        warn Dumper $d;
    }
    
    
    my @e = unpack 'H2' x 6, $d;
    warn Dumper \@e;
    
    for (@e) {
        printf("%02x:", $_);
    }
    

    输出:

    $VAR1 = [
              '11',
              '22',
              '33',
              '44',
              '55',
              '66'
            ];
    $VAR1 = [
              17,
              34,
              51,
              68,
              85,
              102
            ];
    $VAR1 = "\0274Qh\205\20";
    $VAR1 = [
              '17',
              '34',
              '51',
              '68',
              '85',
              '10'
            ];
    11:22:33:44:55:0a:
    

    值102太长,无法打包为H2,因此它被截断。你只得到 10 ,对应于 \20 八进制,即字符16,在十六进制中为10,再次解释为十六进制为 0a .

    你可能认为 hex 将数字转换为十六进制,但它的作用正好相反。也许你最初想要这个?

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    use Data::Dumper;
    
    my $A = "11:22:33:44:55:66";
    my @b = split /:/, $A;
    warn Dumper \@b;
    
    my @c = map sprintf('%02x', $_), @b;
    warn Dumper \@c;
    
    my $d = pack 'H2' x 6, @c;
    {   local $Data::Dumper::Useqq = 1;
        warn Dumper $d;
    }
    
    
    my @e = unpack 'H2' x 6, $d;
    warn Dumper \@e;
    
    print hex, ':' for @e;