我正在尝试按照RFC 6455规范在python中实现我自己的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位值 这就是我需要帮助的可能甚至链接到这个数学运算如何我用Google搜索/ duckducked我的大脑大部分结果来自stackoverflow
甚至更多的修修补补和它开始落实到位我已经被困在这里大约4天了,现在仍然没有解决任何人可以提供的信息。
答案 0 :(得分:1)
如果你只需要考虑第一个(最高有效)4位,你需要右移4(使用And进行额外屏蔽可能是无用的,例如,如果你的值在0-255范围内,但它甚至会强调你感兴趣的比特)。 E.g。
>>> 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
这样的八位字节,每个字母都有一点。你必须转移和And以隔离你感兴趣的位。例如。假设你的规范说cd
位定义了四种不同的东西。为了获得0-3的数字,你再次右移4,并且使用3,即0000 0011
,即你“隔离”你想要的位数。