4

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

它应该打印的正确值是,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";
4

3 回答 3

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

PatternC3输出三个无符号字节,而不是长度为 3 的字符串。

我想你想要a3。请参阅Perldoc 包()

于 2012-10-11T05:07:13.750 回答
1

我犯了两个错误。

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

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

并且

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

于 2012-10-11T05:22:44.993 回答
0

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

您希望band成为 16 位字(yin yyyy yyxx xxxx xxxx)的最高有效 6 位。为此,使用$_ >> 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;
于 2012-10-11T06:29:45.400 回答