我正在阅读一些基于 UDP 的 MPEG 传输流协议,其中有一些时髦的位字段(例如长度 13)。我正在使用“struct”库进行广泛的解包,但是有没有一种简单的方法可以说“获取接下来的 13 位”,而不必手动调整位操作?我想要类似 C 处理位字段的方式(无需恢复到 C)。

建议?

有帮助吗?

解决方案

这是一个经常被问到的问题。有一个 ASPN 食谱 过去对我有用的条目。

并且有一个 人们希望从执行此操作的模块中看到大量的要求。

其他提示

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

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

from bitstring import Bits, BitStream  

# Opening from a file means that it won't be all read into memory
s = Bits(filename='test.ts')
outfile = open('test_nonull.ts', 'wb')

# Cut the stream into 188 byte packets
for packet in s.cut(188*8):
    # Take a 13 bit slice and interpret as an unsigned integer
    PID = packet[11:24].uint
    # Write out the packet if the PID doesn't indicate a 'null' packet
    if PID != 8191:
        # The 'bytes' property converts back to a string.
        outfile.write(packet.bytes)

这是另一个包括从比特流读取的示例:

# 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()

完整的文档是 这里.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top