为什么我使用 perl 5.12.4 和 5.20.2 使用 pack('H*', ...) 会得到意想不到的结果?
Why am I getting unexpected results with pack('H*', ...) with perl 5.12.4 and 5.20.2?
我正在对 ($a ^= $b)
字符串进行异或运算,并且必须将它们表示为十六进制数。我可以使用 sprintf
来做到这一点,但如果可能的话,我更喜欢使用 pack('H*', ...)
。我已经打包了表达嵌入式注释问题的测试代码。谁能解释为什么 pack('H*', ...)
语句失败?谢谢和问候。
use strict;
my @a = qw(a b c d e f g h);
print "@a\n";
my @b = map ord, @a;
foreach (@b) { print "$_\n" };
print scalar(@b), "\n";
my $pad = pack('H*', @b); # why doesn't this work????
print "$pad after pack('H*', \@b) = $pad \t\t # garbage :-(\n";
print length($pad), "\n";
$pad = pack('C*', @b);
print "$pad after pack('C*', \@b) = $pad \t # correct\n";
$pad =~ s/(.)/sprintf("%x",ord())/eg;
print "$pad after sprintf() = $pad\t # correct :-)\n";
exit(0);
再次感谢。
您真正想要的结果是什么?
pack
的 H
模板需要一个十六进制字符串,returns 一个由这些十六进制代码点处的字符组成的字符串。所以 pack 'H*', '414243'
会给你 ABC
我猜你想要相反的结果,所以像这样使用 unpack
my @a = qw(a b c d e f g h);
say unpack 'H*', join '', @a;
输出
6162636465666768
我正在对 ($a ^= $b)
字符串进行异或运算,并且必须将它们表示为十六进制数。我可以使用 sprintf
来做到这一点,但如果可能的话,我更喜欢使用 pack('H*', ...)
。我已经打包了表达嵌入式注释问题的测试代码。谁能解释为什么 pack('H*', ...)
语句失败?谢谢和问候。
use strict;
my @a = qw(a b c d e f g h);
print "@a\n";
my @b = map ord, @a;
foreach (@b) { print "$_\n" };
print scalar(@b), "\n";
my $pad = pack('H*', @b); # why doesn't this work????
print "$pad after pack('H*', \@b) = $pad \t\t # garbage :-(\n";
print length($pad), "\n";
$pad = pack('C*', @b);
print "$pad after pack('C*', \@b) = $pad \t # correct\n";
$pad =~ s/(.)/sprintf("%x",ord())/eg;
print "$pad after sprintf() = $pad\t # correct :-)\n";
exit(0);
再次感谢。
您真正想要的结果是什么?
pack
的 H
模板需要一个十六进制字符串,returns 一个由这些十六进制代码点处的字符组成的字符串。所以 pack 'H*', '414243'
会给你 ABC
我猜你想要相反的结果,所以像这样使用 unpack
my @a = qw(a b c d e f g h);
say unpack 'H*', join '', @a;
输出
6162636465666768