Hva er den beste måten å gjøre Bit Feltet manipulasjon i Python?

stemmer
25

Jeg leser noen MPEG Transport Stream-protokollen over UDP og den har noen funky bitfields i det (lengde 13 for eksempel). Jeg bruker struct biblioteket for å gjøre den brede utpakking, men er det en enkel måte å si Grab de neste 13 bits heller enn å hånd finjustere litt manipulasjon? Jeg vil gjerne ha noe som måten C gjør bits felt (uten å måtte gå tilbake til C).

Forslag?

Publisert på 02/09/2008 klokken 14:28
kilden bruker
På andre språk...                            


2 svar

stemmer
25

Den bitstring Modulen er utviklet for å løse nettopp dette problemet. Det vil la deg lese, endre og lage data ved hjelp av biter som de grunnleggende byggesteiner. De siste versjonene er for Python 2.6 eller senere (inkludert Python 3), men versjon 1.0 støttes Python 2.4 og 2.5 så vel.

Et relevant eksempel for deg kan være dette, som strimler ut alle null pakker fra en transportstrøm (og ganske muligens bruker 13 bit feltet?):

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)

Her er et annet eksempel inkludert lesing fra bitstrømmer:

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

Du kan bruke standard skive notasjon til å skjære, slette, revers, overskrive, etc. på bit-nivå, og det er litt nivå funn, erstatte, delt etc. funksjoner. Forskjellige endiannesses er også støttet.

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

Den fullstendige dokumentasjonen er her .

Svarte 06/07/2009 kl. 12:20
kilden bruker

stemmer
8

Det er en ofte stilte spørsmål. Det er en ASPN Kokebok oppføring på den som har tjent meg i det siste.

Og det er en omfattende side av krav en person ønsker å se fra en modul gjør dette.

Svarte 02/09/2008 kl. 15:13
kilden bruker

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