2016-07-11 12 views
2

Ich habe ein einzigartiges Problem (zumindest soweit ich aus den Stunden, die ich hier auf SO und verbracht habe bei Google-Suchen).Umwandlung einer Liste mit Nullen und Einsen in ein Bitarray (mit Bitarray-Modul) und Ausgabe in eine Binärdatei Fehler

Ich habe eine Liste von 0 und 1 ganze Zahlen von unterschiedlichen Listenlänge, zum Beispiel:

[0, 1, 0, 0 ,1, 0, 0, 0, 0, 0, 0...] 

Ich Umwandlung dieser Liste in eine bitarray, etwa so:

from bitarray import bitarray 
def binWise(sequence): 
    newseq = bitarray(sequence) 
    return newseq 

und diese gibt eine binäre Ausgabe im Format:

zurück
b'01001000001' 

jedoch, wenn ich versuche, t zu schreiben seine auf einen direkt als Binärdatei, erhalte ich

TypeError: 'bitarray' does not support the buffer interface 

Gibt es eine Möglichkeit die binären Daten direkt in eine binäre Datei ausgeben? Ich habe nichts gegen 3rd-Party-Modul Vorschläge. Aber je einfacher desto besser.

+0

Öffnen Sie die Datei im Binärmodus? –

+0

@ JonClements: das ist, was die Ausnahme eigentlich vorschlägt. –

+0

Was möchten Sie tun, wenn die Länge des Bitarrays nicht ein Vielfaches von 8 ist? – user2357112

Antwort

1

Sie benötigen eine der folgenden Methoden verwenden, um ein bytes oder str String-Objekt zu erzeugen:

  • .to01() eine Reihe von '0' und '1' Zeichen erzeugt.
  • .tobytes() erzeugt ein Objekt bytes mit jeder Sequenz von 8 Bits (ein Byte) konvertiert in ein Byte in der bytes Sequenz. Die bitarray ist mit einer Länge aufgefüllt, die ein Vielfaches von 8
  • .tofile(f) ist, schreibt die bitarray Informationen in eine Datei (im Binär-Modus), wieder auf eine Länge aufgefüllt, die ein Vielfaches von 8.
1

ist, um Pack Nullen und Einsen in ein binäres bitweise Format, die numpy packbits können verwendet werden:

>>> import numpy as np 
>>> x = np.packbits([1, 0, 0, 0 , 0, 0, 0, 1]) 
>>> x 
array([129], dtype=uint8) 

uint8 bedeutet, dass numpy wird jedes Byte in den Daten als unsigned-Zahlen anzeigt.

>>> with open('output.dat', 'wb') as f: 
... f.write(x) 
... 

Packbits Ihre Daten werden packen in so viele Bytes, wie es braucht:

Dieses Array kann eine Datei geschrieben werden. Daten, die nicht einmal Multiplex von 8 lang ist, wird leicht zu handhaben:

>>> x = np.packbits([1, 0, 0, 0 , 0, 0, 0, 1, 1, 1]) 
>>> x 
array([129, 192], dtype=uint8) 

Wie Sie sehen können, neunten und zehnten Bits, 1, 1, werden im zweiten Byte setzen mit den ‚hohen‘ Bits zu starten.

+1

Das hat super funktioniert!Vielen Dank, ich hatte keine Ahnung, dass NumPy diese Funktionalität hatte. – EvvoCation