Question

Je lis un protocole MPEG Transport Stream sur UDP et il contient des champs de bits géniaux (longueur 13 par exemple).J'utilise la bibliothèque "struct" pour effectuer le déballage général, mais existe-t-il un moyen simple de dire "Récupérez les 13 bits suivants" plutôt que de devoir modifier manuellement la manipulation des bits ?J'aimerais quelque chose comme la façon dont C bit les champs (sans avoir à revenir à C).

Suggestions?

Était-ce utile?

La solution

C'est une question souvent posée.Il y a un Livre de recettes ASPN entrée là-dessus qui m'a servi dans le passé.

Et il y a un page complète d'exigences qu'une personne aimerait voir dans un module faisant cela.

Autres conseils

Le chaîne de bits Le module est conçu pour résoudre uniquement ce problème.Il vous permettra de lire, modifier et construire des données en utilisant des bits comme éléments de base.Les dernières versions concernent Python 2.6 ou version ultérieure (y compris Python 3), mais la version 1.0 prend également en charge Python 2.4 et 2.5.

Un exemple pertinent pour vous pourrait être celui-ci, qui supprime tous les paquets nuls d'un flux de transport (et utilise très probablement votre champ de 13 bits ?) :

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)

Voici un autre exemple incluant la lecture à partir de flux binaires :

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

Vous pouvez utiliser la notation de tranche standard pour découper, supprimer, inverser, écraser, etc.au niveau du bit, et il y a la recherche, le remplacement, le fractionnement, etc.les fonctions.Différentes endianness sont également prises en charge.

# 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 documentation complète est ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top