2012-05-12 23 views
0

アンパックで作業するとき、私はb3が3ビット長のビット列を返すことを期待していました。Perlのビット列の解析

私は(WebSocketのデータパケットを解析するために)書くことを期待していたコードされた:

my($FIN,$RSV1, $RSV2, $RSV3, $opcode, $MASK, $payload_length) = unpack('b1b1b1b1b4b1b7',substr($read_buffer,0,2)); 

私はこれは私が望んでいたものを行っていないことに気づきました。

上記のテンプレートの代わりにb16を使用した場合、最初の変数に2バイト全体が「1000000101100001」としてロードされます。

これは素晴らしいことですが、問題はありません。

これまでのところ、部分文字列を使用することで使用できますが、これを行うには良い方法がありますか?私は、作成しようとしたものに似たテンプレートでそのビット列を処理する方法があることを望んでいました。右側のパケットの仕様と左側の変数のリストを渡すことができる、ある種の機能ですか?

編集:私は正規表現でこれをやりたいとは思わない。なぜなら、非常にタイトなループになり、多く発生するからだ。

Edit2:理想的には、ビットストリングを(ブール値、整数など)として評価する必要があることを指定できることは理想的です。

+0

'$ read_buffer'には何がありますか? –

+0

@SinanÜnür$ read_bufferはパケットのバイナリデータです – GoldenNewby

答えて

1

私が正しく理解していれば、目標は2バイトの入力を7つの新しい変数に分割することです。 この目的のために、ビット単位の操作を使用できます。これはあなたの$opcode値を取得する方法の例です:

my $b4 = $read_buffer & 0x0f00; # your mask to filter 9-12 bits 
$opcode = $b4 >> 8;    # rshift your bits 

(あなたがしたい場合は、おそらく単一のステートメントで)あなたはすべての変数に同じ操作を行うことができますし、それはresonable良い速度で実行する必要があります。

+0

通常、最初にシフトされます(たとえば、 '$ $ opcode =($ read_buffer >> 8)& 0xF;')。 – ikegami