Domanda

Sto leggendo alcuni Flusso di Trasporto MPEG protocollo UDP e ha alcuni funky campi di bit in esso (lunghezza 13 per esempio).Sto usando il "struct" biblioteca per fare l'ampia disimballaggio, ma c'è un modo semplice per dire "Prendi il prossimo 13 bit" piuttosto che avere a portata di mano-tweak la manipolazione dei bit?Vorrei qualcosa di simile al modo in C campi di bit (senza dover ripristinare C).

Suggerimenti?

È stato utile?

Soluzione

È una domanda posta frequentemente.C'è un ASPN Ricettario voce su di esso che mi ha servito in passato.

E c'è un ampia pagina di requisiti di una persona che vorresti vedere da un modulo che fa questo.

Altri suggerimenti

Il bitstring questo modulo è stato progettato per affrontare proprio questo problema.Esso ti consente di leggere, modificare e costruire dei dati utilizzando i bit come i blocchetti di costruzione di base.Le ultime versioni sono per Python 2.6 o versione successiva (tra cui Python 3) ma la versione 1.0 supportato Python 2.4 e 2.5.

Un esempio rilevante per te potrebbe essere questo, che esclude tutti i null pacchetti da un flusso di trasporto (e, molto probabilmente, utilizza il 13 campo di bit?):

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)

Ecco un altro esempio di tra cui la lettura da sequenze di bit:

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

È possibile utilizzare standard fetta di notazione per tagliare, eliminare, reverse, sovrascrivere, etc.a livello di bit, e ci sono a livello di bit trovare, sostituire, split, etc.funzioni.Diversi utilizzati normalmente sono supportati.

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

La documentazione completa è qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top