Wie kann man lesen Bytes aus Datei in Python
Frage
ähnlich href="https://stackoverflow.com/questions/5415/convert-bytes-to-floating-point-numbers-in-python"> diese Frage
Ich lese zuerst alle zehn Bytes in einen String. Ich möchte dann die einzelnen Informationen analysieren, aus. kann ich die beiden Versionsnummer Zeichen in der Zeichenfolge, greifen aber dann habe ich keine Ahnung, wie diese beiden Zeichen zu nehmen und eine ganze Zahl von ihnen bekommen. Die Struktur Paket scheint zu sein, was ich will, aber ich kann es nicht arbeiten. Hier ist mein Code so weit (ich bin sehr neu btw Python ... es so nehmen einfach auf mich): Ausdruck außer jeden Wert Mist ist offensichtlich, weil sie nicht korrekt formatiert sind. def __init__(self, ten_byte_string):
self.whole_string = ten_byte_string
self.file_identifier = self.whole_string[:3]
self.major_version = struct.pack('x', self.whole_string[3:4]) #this
self.minor_version = struct.pack('x', self.whole_string[4:5]) # and this
self.flags = self.whole_string[5:6]
self.len = self.whole_string[6:10]
Lösung
Wenn Sie eine Zeichenfolge haben, mit 2 Bytes, die Sie wünschen, als ein 16-Bit-Integer zu interpretieren, können Sie dies durch:
>>> s = '\0\x02'
>>> struct.unpack('>H', s)
(2,)
Beachten Sie, dass die> ist für Big-Endian (der größte Teil der ganzen Zahl zuerst kommt). Dies ist das Format ID3-Tags verwenden.
Für andere Größen von integer, verwenden Sie unterschiedliche Formatcodes. z.B. "I" für eine 32-Bit-Integer signiert. Siehe Hilfe (struct) für Details.
Sie können auch mehrere Elemente auf einmal auspacken. zB für 2 unsigned Shorts, gefolgt von einem 32-Bit-Wert unterzeichnet:
>>> a,b,c = struct.unpack('>HHi', some_string)
Möchten Sie von Ihrem Code, die Sie suchen (in der Reihenfolge):
- 3 char string
- 2 Single-Byte-Werte (Haupt- und Nebenversion)
- 1-Byte-Flags Variable
- eine 32-Bit-Länge Menge
Das Format-String für diese sei:
ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string)
Andere Tipps
Warum schreiben Sie Ihre eigenen? (Vorausgesetzt, Sie haben nicht diese Optionen ausgecheckt.) Es gibt ein paar Optionen gibt für von MP3-Dateien in Python in ID3-Tag-Informationen zu lesen. Überprüfen Sie mein beantworten über this Frage.
Ich versuche, in einem ID3v2-Tag-Header zu lesen
FWIW, gibt es bereits ein Modul hierfür.
Ich wollte das struct
Paket empfehlen, aber dann sagen Sie, Sie es versucht hatten. Versuchen Sie folgendes:
self.major_version = struct.unpack('H', self.whole_string[3:5])
Die Funktion pack()
convers Python-Datentypen zu den Bits, und die unpack()
Funktion wandelt Bits Python Datentypen.