为什么我的包()打包我的数据?

时间:2012-02-02 23:38:10

标签: perl

我想做的很简单。在下面。

my @arr = split(/\s+/,"50 00 9F 11 00 28 82 48 21 84 BC 00 01 02 01 00 09 01 38 00 23 05 08 01 01 02 00 00 18 00 50 05 00 00 00 00 00 00 00 00 02 00 0C FE CE 00 0F 00 FD FF 2D 00 00 00 00 00 04 01 0C FE");
my @hexData;
my $i=0;
foreach my $elem(@arr){
    $hexData[$i]=hex($elem);
    $i++;
}
my $data= pack ('C', @hexData);
print $data;

它不起作用:(请你帮忙吗?

2 个答案:

答案 0 :(得分:8)

TLP的解决方案非常正确,但pack实际上有能力处理十六进制。

my $data = "50 00 9F 11 00 28 82 48 21 84 BC 00 01 02 01 00 09 01 38 00 23 05 08 01 01 02 00 00 18 00 50 05 00 00 00 00 00 00 00 00 02 00 0C FE CE 00 0F 00 FD FF 2D 00 00 00 00 00 04 01 0C FE";
$data =~ tr/ //d; # Remove the spaces
print pack "H*", $data;

完成没有中间数组的事情。

答案 1 :(得分:3)

我对pack函数并不十分熟悉,但在我看来,您的模板只需要一个值。

也许你应该试试

my $data = pack ('C*', @hexData);

在您使用它的同时,将代码升级为更加流行的内容:

my @arr = qw(50 00 9F 11 00 28 82 48 21 84 BC 00 01 02 01 00 09 01 38 00 23 05 
             08 01 01 02 00 00 18 00 50 05 00 00 00 00 00 00 00 00 02 00 0C FE 
             CE 00 0F 00 FD FF 2D 00 00 00 00 00 04 01 0C FE);
my @hexData;

foreach my $elem (@arr) {
    push @hexData, hex($elem);
}

my $data = pack ('C*', @hexData);
print $data;

甚至:

my $data = pack("C*", map(hex, @arr));