2016-07-11 6 views
2

私は独特の問題を抱えています(少なくとも私がここで費やした時間からわかるように、 Google検索で外出)。0と1のリストをビット配列(ビット配列モジュール)に変換してバイナリファイルに出力するエラー

Iは、例えば、リストの長さを変化させるの0と1の整数のリストを持っている:

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

私は同様に、bitarrayにこのリストを変換している:

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

このしかし

b'01001000001' 

、私はトンを書いてみる:形式のバイナリ出力を返します。彼の直接バイナリとしてファイルに、私は

TypeError: 'bitarray' does not support the buffer interface 

は、バイナリファイルにバイナリデータを直接出力する方法はあり得ますか? サードパーティのモジュールの提案はまったく気にしません。しかし、よりシンプルな方が良い。

+0

バイナリモードでファイルを開いていますか? –

+0

@JonClements:それは実際に例外が示唆しているものです。 –

+0

ビット配列の長さが8の倍数でない場合、どうしますか? – user2357112

答えて

1

あなたはbytesまたはstr文字列オブジェクトを生成するために、次のいずれかの方法を使用する必要があります。

  • .to01()'0''1'文字の文字列を生成します。
  • .tobytes()bytesシーケンスのバイトに変換された8ビット(1バイト)の各シーケンスでbytesオブジェクトを生成します。 bitarrayが(バイナリモードで)ファイルにbitarray情報を書き込む8
  • .tofile(f)の倍数である長さにパディングされ、再び8
1

の倍数である長さにパディングバイナリビット単位形式、numpyののpackbitsにパック0と1を使用することができる。

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

uint8はnumpyのは、符号なし整数として、データの各バイトを表示していることを意味します。

この配列には、ファイルに書き込むことができます:それが必要として

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

パックビットは、できるだけ多くのバイトにデータをパックします。 8長いのも、多重化されていないデータは、簡単に処理されます:あなたが見ることができるように

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

、第9および第10ビット、1, 1は、「高」ビットから始まる第二のバイトに置かれます。

+1

これはうまくいった!あまりにもありがとう、私はNumPyがその機能を持っていたとは思っていませんでした。 – EvvoCation

関連する問題