在Python中进行位字段操作的最佳方法是什么?

在Python中进行位字段操作的最佳方法是什么?,python,udp,bits,bit-fields,Python,Udp,Bits,Bit Fields,我正在读一些UDP上的MPEG传输流协议,其中有一些时髦的位字段(例如长度13)。我正在使用“struct”库来进行广泛的解包,但是有没有一种简单的方法来说“抓取下13位”而不是手动调整位操作?我喜欢C处理位字段的方式(不必还原为C) 建议?这是一个经常被问到的问题。这上面有一个条目过去曾为我服务过 还有一个模块就是为了解决这个问题而设计的。它将允许您使用位作为基本构建块来读取、修改和构造数据。最新版本适用于Python2.6或更高版本(包括Python3),但版本1.0也支持Python2.4

我正在读一些UDP上的MPEG传输流协议,其中有一些时髦的位字段(例如长度13)。我正在使用“struct”库来进行广泛的解包,但是有没有一种简单的方法来说“抓取下13位”而不是手动调整位操作?我喜欢C处理位字段的方式(不必还原为C)


建议?

这是一个经常被问到的问题。这上面有一个条目过去曾为我服务过

还有一个

模块就是为了解决这个问题而设计的。它将允许您使用位作为基本构建块来读取、修改和构造数据。最新版本适用于Python2.6或更高版本(包括Python3),但版本1.0也支持Python2.4和2.5

一个相关的示例可能是这样的,它从传输流中删除所有空数据包(并且很可能使用13位字段):

下面是另一个示例,包括从比特流读取:

# You can create from hex, binary, integers, strings, floats, files...
# This has a hex code followed by two 12 bit integers
s = BitStream('0x000001b3, uint:12=352, uint:12=288')
# Append some other bits
s += '0b11001, 0xff, int:5=-3'
# read back as 32 bits of hex, then two 12 bit unsigned integers
start_code, width, height = s.readlist('hex:32, 2*uint:12')
# Skip some bits then peek at next bit value
s.pos += 4
if s.peek(1):
    flags = s.read(9)
您可以使用标准切片表示法在位级别进行切片、删除、反转、覆盖等操作,并且有位级别的查找、替换、拆分等功能。还支持不同的端部

# Replace every '1' bit by 3 bits
s.replace('0b1', '0b001')
# Find all occurrences of a bit sequence
bitposlist = list(s.findall('0b01000'))
# Reverse bits in place
s.reverse()

完整的文档是。

我认为包[11:24].uint应该是包[12:24].uint。字段长度为13位,从第12位开始,到第24位结束。这应该是一个注释,而不是答案,但不,它确实是[11:24]。索引是从零开始的,不包括结束索引(这是Python和许多其他语言中的标准用法)。因此,仅第一位的切片将是[0:1],而[12:24]将是从第13位到第24位(含第13位)的12位切片。请注意,长度始终是两个索引之间的差值。
# Replace every '1' bit by 3 bits
s.replace('0b1', '0b001')
# Find all occurrences of a bit sequence
bitposlist = list(s.findall('0b01000'))
# Reverse bits in place
s.reverse()