0

我正在尝试按照 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 位值,这就是我需要帮助的,甚至可能是一个指向这个数学如何工作的链接,我用谷歌搜索/duckduckgoed 我的大脑大部分结果来自stackoverflow

更多的修补和它开始到位我已经被困在这个问题上大约 4 天了,但仍然没有解决任何人都可以提供的信息。

4

1 回答 1

1

如果您只需要考虑前 4 位(最高有效位),则需要右移 4 位(使用 And 进行额外屏蔽可能没有用,例如,如果您的值在 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,每个字母都有一点。您必须转换 and 才能隔离您感兴趣的位。例如,假设您的规范说cd位定义了四种不同的东西。为了获得那个 0-3 的数字,你再右移 4,然后用 3,0000 0011也就是说,你“隔离”你想要的位。

于 2012-05-28T21:51:04.730 回答