Frage

Ich lese ein MPEG Transport Stream-Protokoll über UDP und es enthält einige seltsame Bitfelder (z. B. Länge 13).Ich verwende die Bibliothek „struct“, um das umfassende Entpacken durchzuführen. Gibt es jedoch eine einfache Möglichkeit, „Schnapp dir die nächsten 13 Bits“ zu sagen, anstatt die Bitmanipulation manuell anpassen zu müssen?Ich hätte gerne so etwas wie die Art und Weise, wie C Bitfelder ausführt (ohne auf C zurückgreifen zu müssen).

Vorschläge?

War es hilfreich?

Lösung

Das ist eine oft gestellte Frage.Dort ist ein ASPN-Kochbuch Eintrag dazu, der mir in der Vergangenheit geholfen hat.

Und es gibt eine Umfangreiche Seite mit Anforderungen, die eine Person von einem Modul, das dies tut, gerne sehen würde.

Andere Tipps

Der Bitstring Das Modul wurde entwickelt, um genau dieses Problem zu lösen.Damit können Sie Daten mithilfe von Bits als Grundbausteinen lesen, ändern und konstruieren.Die neuesten Versionen sind für Python 2.6 oder höher (einschließlich Python 3), aber Version 1.0 unterstützt auch Python 2.4 und 2.5.

Ein für Sie relevantes Beispiel könnte dieses sein, das alle Nullpakete aus einem Transportstrom entfernt (und möglicherweise Ihr 13-Bit-Feld verwendet?):

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 ist ein weiteres Beispiel einschließlich des Lesens aus Bitströmen:

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

Sie können die Standard-Slice-Notation zum Schneiden, Löschen, Umkehren, Überschreiben usw. verwenden.auf Bitebene, und es gibt Suchen, Ersetzen, Teilen usw. auf Bitebene.Funktionen.Es werden auch verschiedene Endiannesses unterstützt.

# 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 vollständige Dokumentation ist Hier.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top