Schreiben von bits in eine binäre Datei
Habe ich 23 bits als Zeichenfolge dargestellt, und schreiben brauche ich diesen string in eine Binärdatei als 4 bytes. Das Letzte byte ist immer 0. Der folgende code funktioniert (Python 3.3), aber es fühlt sich nicht sehr elegant (ich bin Recht neu bei Python und die Programmierung). Haben Sie irgendwelche Tipps, die machen es besser? Es scheint eine for-Schleife, die nützlich sein könnten, aber wie mache ich das schneiden innerhalb der Schleife, ohne dabei einen IndexError? Beachten Sie, dass, wenn ich zu extrahieren der bits in einem byte, die ich in umgekehrter bit-Reihenfolge.
from array import array
bin_array = array("B")
bits = "10111111111111111011110" #Example string. It's always 23 bits
byte1 = bits[:8][::-1]
byte2 = bits[8:16][::-1]
byte3 = bits[16:][::-1]
bin_array.append(int(byte1, 2))
bin_array.append(int(byte2, 2))
bin_array.append(int(byte3, 2))
bin_array.append(0)
with open("test.bnr", "wb") as f:
f.write(bytes(bin_array))
# Writes [253, 255, 61, 0] to the file
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie es behandeln, wie ein int, dann erstellen Sie die 4 bytes, wie folgt:
int.from_bytes(b'\xfd\xff=\x00', 'little')
und bekommen"10111111111111111011110"
format(int.from_bytes(b'\xfd\xff=\x00', 'little'), '023b')[::-1]
int.to_bytes()
nicht Hinzugefügt Python bis zur version 3.2, so dass für Kompatibilität mit aktuellen und älteren Versionen der Sprache mit denstruct
Modul, wie gezeigt, in den meine Antwort, vorzuziehen, da es funktioniert in beide Python-2.x-und 3.x.Den
struct
Modul wurde entwickelt für genau diese Art der Sache — betrachten Sie das folgende, in dem die Konvertierung zu bytes gegliedert in einige unnötige Zwischenschritte zu verstehen es klarer:Schwerer zu Lesen, aber kürzeren Weg wäre:
Führen Sie die split-in eine Zeile mit
re.findall
Methode:Als Algorithmus können Sie pad
bits
Länge 32 und verwenden Sie dannre.findall
Methode zu der Gruppe, der es in octects:Dein code würde wie folgt Aussehen:
bits = "10111111111111111011110".ljust(32, '0')