为什么我的unpack打印错误的值?

时间:2012-10-11 04:40:02

标签: perl

为什么我得到错误的答案/值?

它应打印的正确值是1, 2175, 4,但我总是得到1, 3, 0

my $data = pack ('C*', map hex, split /\s+/, "01 00 00 00 7F 08 03 00 21 04 80 04 FF D7 FB 0C EC 01 44 00 61 1D 00 00 10 3B 00 00 FF D7 FB 0C 00 00 8C 64 00 00 EC 45");

($obj->{Version}, $obj->{res1}, $obj->{EARFCN}, $tmp1, $obj->{res2}, $tmp2)=unpack("C C3 v C C V", $data);

$obj->{band} = ($tmp1 & 0xfc) >> 2;
print "\n".$obj->{Version};    # Should print 1
print "\n".$obj->{EARFCN};   # Should print 2175
print "\n".$obj->{band};      # Should print 4. Note: this is the first 6 bits from MSB of $tmp1.
print "\n";

3 个答案:

答案 0 :(得分:2)

调试输出:

  DB<1> $data = pack ('C*', map hex, split /\s+/, "01 00 00 00 7F 08 03 00 21 04 80 04 FF D7 FB 0C EC 01 44 00 61 1D 00 00 10 3B 00 00 FF D7 FB 0C 00 00 8C 64 00 00 EC 45")

  DB<2> x unpack("C C3 v C C V", $data)
0  1
1  0
2  0
3  0
4  2175
5  3
6  0
7  75498529

模式C3输出三个无符号字节,而不是长度为三的字符串。

我认为你想要a3。见Perldoc pack()

答案 1 :(得分:1)

我犯了两个错误。

我应该使用a3说明符而不是C3。所以,它应该说:

unpack("C a3 v C C V", $data);

以及

$obj->{band} = ($tmp1 & 0xfc) >> 2;确实为0.而不是4。

答案 2 :(得分:0)

24位字没有模式。 (机器没有这种类型。)您可以使用以下任一代码段。

您希望band成为16位字中最重要的6位(y中的yyyy yyxx xxxx xxxx)。为此,请使用$_ >> 10

(
   $obj->{Version},
   my $tmp0,
   $obj->{EARFCN},
   my $tmp1,
   $obj->{res2},
   my $tmp2
) = unpack("C a3 v C C V", $data);

$obj->{res1} = unpack("V", $tmp0."\x00");
$obj->{band} = $tmp1 >> 10;

(
   my $tmp0,
   $obj->{EARFCN},
   my $tmp1,
   $obj->{res2},
   my $tmp2
) = unpack("V v C C V", $data);

$obj->{Version} = $tmp0 & 0xFF;
$obj->{res1}    = $tmp0 >> 8;
$obj->{band}    = $tmp1 >> 10;