Mi a legjobb módja, ha Bit Field manipuláció Python?

szavazat
25

Olvasom néhány MPEG Transport Stream protokoll UDP felett, és van néhány funky bitfields benne (hosszúság 13 például). Én a „struct” könyvtár nem a széles kicsomagolás, de van egy egyszerű módja annak, hogy azt mondják: „Fogd meg a következő 13 bites” helyett kell kézzel csípés a bit manipuláció? Szeretnék valamit, mint ahogy a C-nek bitmezőkbe (anélkül, hogy visszatér a C).

Javaslatok?

A kérdést 02/09/2008 15:28
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
8

Ez egy gyakran feltett kérdés. Van egy ASPN Cookbook bejegyzést arról, hogy szolgált nekem a múltban.

És van egy kiterjedt lapja követelmények egy ember azt szeretné, hogy egy modul ezt.

Válaszolt 02/09/2008 16:13
a forrás felhasználó

szavazat
25

A bitstring modul célja, hogy foglalkozzon csak ezt a problémát. Ez akkor ismét olvasni, módosítani és a kivitelezést adatokat bit, mint az alapvető építőkövei. A legújabb változatok Python 2.6 vagy későbbi (beleértve a Python 3), de 1.0 verzió támogatott Python 2.4 és 2.5 is.

A megfelelő példa lehet, hogy ez az, ami kiveszi az összes nullpacketek egy szállítási áramot (és valószínűleg használja a 13 bites mező):

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)

Itt egy másik példa többek olvasás bitfolyamokon:

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

Használhat normál szelet jelölést szeleteljük, törlés, fordított, felülírni stb bit szintű, és vannak kicsit szint található, cserélje ki, osztható stb funkciókat. Különböző endiannesses is támogatott.

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

A teljes dokumentáció itt .

Válaszolt 06/07/2009 13:20
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more