_parseMessage
に渡ってくる1byteのデータの最初のbitがfinを表すためです。
最初のbit, つまり1byteの最上位ビットを調べたいので、 0x80
= 2進数表現だと 0b10000000
でマスクしています。
RFC 6455 The WebSocket Protocol - 5.2. Base Framing Protocol から引用します
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
FIN: 1 bit
Indicates that this is the final fragment in a message. The first
fragment MAY also be the final fragment.
この図から、最初の1byte = 8bitの構成要素の内、0x80(=0b10000000)でマスクするとFIN, 0x0F(=0b00001111)でマスクするとopcodeが取得出来ることが分かります。
ソースコード中のコードをこれに従って読み解くと以下のようになります。
Python
1 self.fin = byte & 0x80 # 0b10000000でマスク
2 self.opcode = byte & 0x0F # 0b00001111でマスク
3 rsv = byte & 0x70 # 0b01110000 でマスク
通信データのパケットでは、1byteの中に複数の情報を詰め込んでいるため、1byte未満のbit単位で値を解釈する必要があるため、このようにマスク処理をして、興味のあるbitの状態を確認します。このようなデータを読み解く際に、1byteのデータをそのまま10進数で解釈しないほうがよいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/14 14:20 編集
退会済みユーザー
2017/03/14 14:41 編集