Le module bitstring est conçu pour répondre à tout 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 sont pour Python 2.6 ou version ultérieure (y compris Python 3) mais la version 1.0 supporte aussi Python 2.4 et 2.5.
Un exemple pertinent pour vous est peut-être ce qui supprime tous les paquets nuls à partir d'un flux de transport (et utilise très probablement votre champ de bits 13?):
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, y compris la lecture 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 des tranches standard pour couper, supprimer, inverser, remplacer, etc. au niveau du bit, et il y a trouver le niveau de bits, remplacer, diviser etc fonctions. Différentes endiannesses sont également soutenues. La documentation complète est here.
Je pense que le paquet [11:24] .uint devrait être le paquet [12:24] .uint. Le champ a une longueur de 13 bits, commence au bit 12, se termine au bit 24. –
Cela aurait vraiment dû être un commentaire et non une réponse, mais non, c'est vraiment [11:24]. Les index sont basés sur zéro et ne comprennent pas l'index de fin (ce qui est une utilisation standard en Python et dans de nombreuses autres langues). Donc, une tranche de seulement le premier bit serait [0: 1], alors que [12:24] serait une tranche de 12 bits du 13 au 24 inclusivement. Notez que la longueur est toujours la différence entre les deux indices. –