2017-10-02 2 views
1

웹 소켓 프로토콜에서 데이터를 추출하는 데 문제가 있습니다.

문제는 오른쪽 필드를 가져 오기 위해 bitwise and 작업에 사용되는 16 진 코드를 이해할 수 없다는 것입니다. (코드는 아래 테이블에 있습니다)

다음은 프레임 테이블입니다.패킷 데이터 추출 중 - Websocket 프로토콜 - Python

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 ...    | 
+---------------------------------------------------------------+ 


내 코드 : 우리가 알고있는 방법

import struct 
import math 

def binary(data): 
    if data == 0: return "0"*8 
    _data = str(bin(data))[2:] 
    return _data.rjust(8 * math.ceil(data/255),"0") 

data = b"\x81\x8c\r\x06y\xe2ni\x17\x8che\r\x8bbhC\xd3" 

header, = struct.unpack("!H",data[:2]) 
data = data[2:] 

# HERE # 
FIN = (header >> 15) & 0x01 # <- 
RSV1 = (header >> 14) & 0x01 
RSV2 = (header >> 13) & 0x01 
RSV3 = (header >> 12) & 0x01 
OPCODE = (header >> 8) & 0x0F 
MASK = (header >> 7) & 0x01 
LEN = (header >> 0) & 0x7F 

print(binary(OPCODE)) 

가 특정 진수 코드를 사용하는? (0x01, 0x0F, 0x7F) 그 뒤에있는 논리는 무엇입니까?

모두에게 감사드립니다.

답변

1

이러한 특정 16 진수 코드는 일반 비트 마스크입니다. 그들은 제공된 테이블 (RFC 6455 - Base Framing Protocol)에서 쉽게 결정할 수 있습니다. OPCODE위한

설명 :

  • 총수 : 비트 4, 5, 6, 7
  • 길이 다음 OPCODE를 추출하기 위해 4 비트

, 당신은 비트 연산을 수행한다. 먼저 !H을 사용하여 프레임을 부호없는 반으로 분리하기로 결정한 이후 right shift을 8로해야합니다. 네 OPCODE 비트 그러나, 8 내지 11 비트는 여전히 불필요한 데이터를 포함하는 비트 12 내지 15 위치에 있으며,이 시점에서

header >> 8 

: 코드에서이를 수행한다. 따라서 적절한 마스크를 사용하여 bitwise and 작업을 수행해야합니다. LEN 용 마스크가 마찬가지로 구할 수있다

Mask:  0000000000001111b (0x0F) 
Value: 00000000xxxxxxxxb 
& ---------- BITWISE AND --------- 
Result: 000000000000xxxxb 

이 경우, 마스크 (4) (OPCODE 길이) 가장 왼쪽의 비트를 포함한다. 길이는 7 비트이므로 마스크는 01111111b (0x7F)입니다.

+0

위대한 답변에 감사드립니다. 이제 나는 분명히 이해합니다. – Zaphiel