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

パターンC3は、長さ3の文字列ではなく、3つの符号なしバイトを出力します。

a3代わりに欲しいと思います。Perldoc pack()を参照してください

于 2012-10-11T05:07:13.750 に答える
1

私は2つの間違いを犯しました。

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 ビット ワードのパターンはありません。(マシンにはそのようなタイプはありません。) 次のスニペットのいずれかを使用できます。

band16 ビット ワードの最上位 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;
于 2012-10-11T06:29:45.400 に答える