웹 소켓 프로토콜에서 데이터를 추출하는 데 문제가 있습니다.
문제는 오른쪽 필드를 가져 오기 위해 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
) 그 뒤에있는 논리는 무엇입니까?
모두에게 감사드립니다.
위대한 답변에 감사드립니다. 이제 나는 분명히 이해합니다. – Zaphiel