为什么我得到错误的答案/值?
它应打印的正确值是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";
答案 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;