バイト単位でファイルを読み取ろうとしていますが、その方法がわかりません。私はそのようにしようとしています:
file = open(filename, 'rb')
while 1:
byte = file.read(8)
# Do something...
それで、すべてのループの先頭に変数バイトに次の8ビットが含まれるようになりますか?それらのバイトが実際に何であるかは関係ありません。重要なのは、8ビットスタックでファイルを読み取る必要があることだけです。
編集:
また、これらのバイトをリストに収集し、ASCII文字として印刷されないように印刷したいのですが、生のバイトとして、つまりそのバイトリストを印刷すると結果が得られますなので
['10010101', '00011100', .... ]
質問の2番目の部分に答えるには、バイナリに変換するために format string と ord
関数を使用できます。
>>> byte = 'a'
>>> '{0:08b}'.format(ord(byte))
'01100001'
フォーマットには適切な数の先行ゼロが埋め込まれていることに注意してください。これが要件のようです。このメソッドには、Python 2.6以降が必要です。
1バイトを読み取るには:
file.read(1)
8ビットは1バイトです。
表示したコードは8 bytesになります。使用できます
with open(filename, 'rb') as f:
while 1:
byte_s = f.read(1)
if not byte_s:
break
byte = byte_s[0]
...
「 struct 」と呼ばれるバイナリエンコードデータの読み書き用に特に作成されたpythonモジュールがあります。 2.6未満のPythonのバージョンはstr.formatをサポートしていないため、バイナリ形式の文字列を作成するには カスタムメソッド を使用する必要があります。
import struct
# binary string
def bstr(n): # n in range 0-255
return ''.join([str(n >> x & 1) for x in (7,6,5,4,3,2,1,0)])
# read file into an array of binary formatted strings.
def read_binary(path):
f = open(path,'rb')
binlist = []
while True:
bin = struct.unpack('B',f.read(1))[0] # B stands for unsigned char (8 bits)
if not bin:
break
strBin = bstr(bin)
binlist.append(strBin)
return binlist
パーティーに遅れましたが、これは迅速な解決策を探している人を助けるかもしれません:
bin(ord('b')).replace('b', '')
bin()を使用すると、最後のビットの後に「b」が付いたバイナリ表現が得られます。削除する必要があります。また、ord()は、charにASCII番号)または8ビット/ 1バイトのコード化文字を提供します。
乾杯