0

RFC 6455 仕様に従って Python im で独自の Websocket サーバーを実装しようとしていますが、Base Frame ヘッダーからビットを抽出する際に問題が発生しています。

プロトコルに問題はありません 基本的なバイナリ/16進数の魔法に問題があります

仕様によると、最初の 4 ビットは単一のビット値です。

最初のビットを取得するには、次のようなことを行います (d は websocket からのデータです)。

first_byte = ord(d[0])
print "finished bit",(first_byte >> 7) & 1

後でペイロードサイズを取得したい場合は、私が行います

sec_byte = ord(d[1])
print "payload size",sec_byte & 0x7f

ただし、仕様の後半では、オペコードの 4 ビット値を取得する必要があります。これは、この数学がどのように機能するかについてのリンクでさえ、助けが必要なものです

さらにいじくり回し、その場所に落ち始めました。私はこれで約4日間立ち往生していましたが、誰もが提供できる情報についてはまだ解決されていません。

4

1 に答える 1

1

最初の (最も重要な) 4 ビットのみを考慮する必要がある場合は、4 だけ右にシフトする必要があります (たとえば、値が 0 から 255 の範囲にある場合など、 And を使用した追加のマスキングは役に立たない可能性がありますが、それはビットにストレスを与えますに興味があります)。例えば

>>> d = [128, 80, 40]
>>> print (d[0] >> 4) & 15
8
>>> print (d[1] >> 4) & 15
5
>>> print (d[2] >> 4) & 15
2

128 は 2 進数1000 0000です。4 だけ右にシフトすると0000 1000(「新しい」0 ビットが左から入る)、つまり 8 になります。80は0101 0000、そう得0000 0101です; そして最終的に400010 1000はと取得し0000 0010ます。

abcd efgh一般に、各文字がビットであるようなオクテットを考えてみましょう。関心のあるビットを分離するには、Shift と And を使用する必要があります。たとえば、cdビットが 4 つの異なる種類の何かを定義すると仕様書に記載されているとします。その 0 ~ 3 の数値を取得するには、再び 4 だけ右にシフトし、3 で0000 0011、つまり、必要なビットを「分離」します。

于 2012-05-28T21:51:04.730 に答える