当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Python中进行位域操作的最佳方法是什么?》经验,为你挑选了2个好方法。

我正在通过UDP读取一些MPEG传输流协议,它有一些时髦的位域(例如长度为13).我正在使用"struct"库来进行广泛的解包,但有一种简单的方法可以说"抓住下一个13位"而不必手动调整位操作吗?我想要像C做位字段的方式(不必回复到C).

建议?



1> Scott Griffi..:

该位串模块旨在解决眼前这个问题.它将允许您使用位作为基本构建块来读取,修改和构造数据.最新版本适用于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()

完整的文档在这里.



2> Thomas Vande..:

这是一个经常被问到的问题.上面有一个ASPN Cookbook条目,它曾经为我提供过服务.

并且有一个人希望从一个模块中看到一个广泛的需求页面.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有