0

unpack を使用するとき、b3 が長さ 3 ビットのビット文字列を返すことを期待していました。

(websocket データ パケットを解析するために) 書きたいと思っていたコードは次のとおりです。

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

これは私が望んでいたことをしていないことに気付きました。

上記のテンプレートの代わりに b16 を使用すると、2 バイト全体が最初の変数に "1000000101100001" として読み込まれます。

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

一連の部分文字列を実行することで、これまでに得たものを使用できますが、これを行うより良い方法はありますか? 私が作成しようとしたものと同様のテンプレートを使用して、そのビット文字列を処理する方法があることを期待していました. 右側にパケットの仕様を渡し、左側に変数のリストを渡すことができるある種の関数はありますか?

編集:正規表現でこれを行いたくありません。これは、頻繁に発生する非常にタイトなループになるためです。

Edit2: 理想的には、ビット文字列を評価する対象 (ブール値、整数など) を指定できると便利です。

4

1 に答える 1

1

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

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

すべての変数に対して同じ操作を (必要に応じて 1 つのステートメントで) 行うことができ、適切な速度で実行されるはずです。

于 2012-05-12T19:35:06.693 に答える