Python Bit Saha manipülasyon yapmanın en iyi yolu nedir?

oy
25

Ben UDP üzerinden bazı MPEG Transport Stream protokolünü okuyorum ve içinde bazı korkak bitfields (örneğin uzunluk 13) sahiptir. Önümüzdeki 13 bitlik tut yerine biraz manipülasyon el çimdik zorunda ben geniş açılmasını yapmak yapı kitaplık kullanıyorum, ancak söylemek için basit bir yol var mı? Ben (C dönmek zorunda kalmadan) C bit alanlarını yaptığı yol gibi bir şey istiyorum.

Öneriler?

Oluştur 02/09/2008 saat 15:28
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
8

Bu sıkça sorulan bir soru. Bir var AspN Cookbook geçmişte bana hizmet etti Üzerinde girişi.

Ve bir orada bir kişi bunu yaparken bir modülden görmek istiyorum gereksinimleri geniş sayfası.

Cevap 02/09/2008 saat 16:13
kaynak kullanıcı

oy
25

Bit dizisi modülü sadece bu sorunu çözmek için tasarlanmıştır. Size okumak, değiştirmek ve temel yapı taşları olarak bitleri kullanarak veri oluşturmak izin verir. Son sürümlerini (Python 3 dahil olmak üzere), daha sonra Python 2.6 veya içindir ancak sürüm 1.0 de 2.5 Python 2.4 desteklenen ve.

Sana bir ilgili örnek bir nakil akımından tüm boş paketler çıkarır ki, bu olabilir (ve büyük ihtimalle sizin 13 bit alanını kullanır?):

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)

İşte çatılma okuma da dahil olmak üzere başka bir örnek:

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

vb fonksiyonlar bölünmüş, değiştirme Sen bit düzeyinde, vb dilim silmek ters üzerine yazmak standart dilim gösterimini kullanabilirsiniz ve bit düzeyinde bulmak vardır. Farklı endiannesses da desteklenmektedir.

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

Tam dokümantasyon olduğunu burada .

Cevap 06/07/2009 saat 13:20
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more