ما هي أفضل طريقة للقيام بت مجال التلاعب في الثعبان ؟

StackOverflow https://stackoverflow.com/questions/39663

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أقرأ بعض MPEG تيار النقل على البروتوكول UDP و غير تقليدي bitfields في ذلك (طول 13 على سبيل المثال).أنا باستخدام "البنية" المكتبة للقيام واسعة تفريغ, ولكن هناك طريقة بسيطة تقول "انتزاع القادم 13 بت" بدلا من أن اليد قرص بت التلاعب ؟ أريد شيئا مثل الطريقة C بت المجالات (دون الحاجة إلى الرجوع إلى ج).

اقتراحات ؟

هل كانت مفيدة؟

المحلول

انها في كثير من الأحيان-سؤال.هناك ASPN طبخ دخول على ذلك وقد تقدم لي في الماضي.

و هناك واسعة صفحة من متطلبات شخص واحد تود أن ترى من الوحدة القيام بذلك.

نصائح أخرى

على bitstring تم تصميم وحدة معالجة فقط هذه المشكلة.وسوف تتيح لك قراءة وتعديل بناء البيانات باستخدام بت كما اللبنات الأساسية.أحدث الإصدارات بايثون 2.6 أو أحدث (بما في ذلك بيثون 3) ولكن الإصدار 1.0 دعم بيثون 2.4 و 2.5 كذلك.

سبيل المثال ذات الصلة بالنسبة لك قد يكون هذا الذي تجرد من كل باطل الحزم من تيار النقل (وربما يستخدم 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)

هنا مثال آخر بما في ذلك قراءة من عبر:

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

يمكنك استخدام معيار شريحة التدوين إلى شريحة, حذف, عكس, الكتابة, الخ.على مستوى البت ، و هناك بعض مستوى العثور على, محل, سبليت.... الخالمهام.مختلفة endiannesses كما يتم دعم.

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

كامل الوثائق هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top