Ποιος είναι ο καλύτερος τρόπος για να γίνει Bit χειραγώγηση πεδίο στην Python;

ψήφοι
25

Διαβάζω κάποια πρωτόκολλο MPEG Ροή μεταφοράς πάνω από UDP και έχει μερικά funky bitfields σε αυτό (μήκους 13 για παράδειγμα). Είμαι χρησιμοποιώντας το «struct» βιβλιοθήκη για να κάνουν το ευρύ αποσυσκευασία, αλλά είναι ένας απλός τρόπος για να πούμε εκεί «Πιάσε τα επόμενα 13 bits» όχι πρέπει να το χέρι τσίμπημα το χειρισμό λίγο; Θα ήθελα κάτι σαν τον τρόπο C κάνει πεδία bit (χωρίς να χρειάζεται να επανέλθει C).

Προτάσεις;

Δημοσιεύθηκε 02/09/2008 στις 15:28
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
8

Είναι μια συχνά-ερώτηση. Υπάρχει μια Αερ-Ν Cookbook την είσοδο σε αυτό που μου έχει υπηρετήσει στο παρελθόν.

Και υπάρχει μια σελίδα εκτεταμένες απαιτήσεις ένα άτομο θα ήθελε να δει από μια μονάδα αυτόν τον τρόπο.

Απαντήθηκε 02/09/2008 στις 16:13
πηγή χρήστη

ψήφοι
25

Η συμβολοσειρά μονάδα έχει σχεδιαστεί για να αντιμετωπίσει ακριβώς αυτό το πρόβλημα. Θα σας αφήσει να διαβάσετε, να τροποποιήσετε και να κατασκευάσει τα δεδομένα χρησιμοποιώντας κομμάτια σαν τα βασικά δομικά στοιχεία. Οι τελευταίες εκδόσεις είναι για την Python 2.6 ή νεότερη έκδοση (συμπεριλαμβανομένων των Python 3), αλλά η έκδοση 1.0 υποστηρίζεται Python 2.4 και 2.5, καθώς και.

Ένα σχετικό παράδειγμα θα μπορούσε να είναι αυτό, το οποίο αφαιρεί όλα τα null πακέτα από ένα ρεύμα μεταφοράς (και πολύ πιθανόν χρησιμοποιεί το δικό σας πεδίο 13 bit;):

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)

Εδώ είναι ένα άλλο παράδειγμα συμπεριλαμβανομένων ανάγνωση από bitstreams:

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

Μπορείτε να χρησιμοποιήσετε την κανονική σημειογραφία φέτα σε φέτα, διαγραφή, αναστροφή, αντικατάσταση, κλπ σε επίπεδο bit, και υπάρχουν λίγο επίπεδο εύρημα, αντικατάσταση, διάσπαση κλπ λειτουργίες. Διαφορετικές 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()

Η πλήρης τεκμηρίωση είναι εδώ .

Απαντήθηκε 06/07/2009 στις 13:20
πηγή χρήστη

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