我正在尝试按照 RFC 6455 规范在 python im 中实现我自己的 Websocket 服务器,并且在从基本帧标头中提取位时遇到问题
我对协议没有问题 我在基本的二进制/十六进制数学魔术方面有问题
根据规格,前 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位,你需要右移4(额外的掩码和 和可能没有用,例如,如果你的值在0-255范围内,但它甚至强调你感兴趣的位)。 例如
>>> d = [128, 80, 40]
>>> print (d[0] >> 4) & 15
8
>>> print (d[1] >> 4) & 15
5
>>> print (d[2] >> 4) & 15
2
128是二进制1000 0000
;右移4得到0000 1000
("新"0位从左进入),即8;80是0101 0000
,所以你得到0000 0101
;最后40是0010 1000
,我们得到0000 0010
。
一般来说,考虑像abcd efgh
这样的八位字节,其中每个字母都是一个位。你必须转移和 为了隔离你感兴趣的位。例如,假设您的规范说cd
位定义了四种不同类型的东西。为了获得那个 0-3 的数字,你再次右移 4,用 3 移位,即0000 0011
,即你"隔离"你想要的位。