Vra

Ek lees 'n paar MPEG Vervoer Stroom protokol oor UDP en dit het 'n paar funky bitfields in dit (lengte 13 byvoorbeeld). Ek gebruik die "struct" biblioteek om die breë pak doen, maar daar is 'n eenvoudige manier om te sê "Gryp die volgende 13 stukkies" eerder as moet inhandig-tweak die bietjie manipulasie? Ek sal iets soos die manier C doen bietjie velde hou (sonder om terug te keer na C).

Voorstelle?

Was dit nuttig?

Oplossing

Dit is 'n dikwels-gevra vraag. Daar is 'n ASPN Kookboek inskrywing op dit wat my in die verlede gedien het.

En daar is 'n uitgebreide bladsy van vereistes een persoon sou graag wou sien van 'n module om dit te doen.

Ander wenke

Die bitstring module is ontwerp om net hierdie probleem aan te spreek. Dit sal toelaat dat jy lees, verander en te rig data met behulp van stukkies as die basiese boustene. Die nuutste weergawes is vir Python 2.6 of later (insluitend Python 3) maar weergawe 1.0 ondersteun Python 2.4 en 2.5 asook.

'n toepaslike voorbeeld vir julle kan dit wees, wat repies uit al die nul pakkies van 'n vervoer stroom (en heel moontlik gebruik jou 13 bit veld?):

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)

Hier is nog 'n voorbeeld insluitend die lees van bitstreams:

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

Jy kan standaard sny notasie gebruik by die bietjie vlak te sny, verwyder, om te keer, te vervang, ens, en daar is bietjie vlak vind, te vervang, verdeel ens funksies. Verskillende endiannesses word ook ondersteun.

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

Die volledige dokumentasie is hier .

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top