2016-08-10 9 views
0

いくつかの複雑なプロジェクトに取り組んでいる間、私は面白いバグに出くわした:のPython - バイナリにnumとnum個のバイナリ - 間違った出力

コードは、ファイルを読み込み、整数にバイナリ変換し、ファイルに書き込みます。 他の人はこのファイルを読み取り、整数をバイナリに変換してファイルに書き込みます。

理想的には、入力ファイルと変換ファイルは同じである必要があります。しかし、それは起こっていません。

P1は以下のコードを見つける:

def readDecDataFromFile(filename): 
    data = [] 
    with open(filename) as f: 
     data = data + f.readlines() 
    chunks, chunk_size = len(data[0]), 6 
    return [ data[0][i:i+chunk_size] for i in range(0, chunks, chunk_size) ] 

def numToBinary(N): 
     return str(int(bin(int(N))[2:])) 

ddata = readDecDataFromFile('im1') 
bytes = [] 
for d in ddata: 
    bits = numToBinary(d) 
    bytes.append(int(bits[::-1], 2).to_bytes(1, 'little')) 
f = open('orig_input', 'wb') 
for b in bytes: 
    f.write(b) 
f.close() 

# read file -> convert to binary -> binary to num -> write file 

def bits(f): 
    byte = (ord(b) for b in f.read()) 
    for b in byte: 
     bstr = [] 
     for i in range(8): 
      bstr.append((b >> i) & 1) 
     yield bstr 
def binaryToNum(S): 
    bits = len(S) 
    if (S==''): return 0 
    elif (S[0] == '0'): return binaryToNum(S[1:]) 
    elif (S[0] == '1'): return ((2**(bits-1))) + binaryToNum(S[1:]) 

bstr = [] 
for b in bits(open('input_test', 'r')): 
    bstr.append(b) 
dstr = '' 
for i in bstr: 
    b_num = str(binaryToNum(''.join(str(e) for e in i))).zfill(6) 
    dstr = dstr + b_num 

ter = open('im1', 'w') 
for item in dstr: 
    ter.write(item) 
ter.close() 

この部分は正しいようだが、私は他のマシン上のコードがこれを行うAZ、AZと0-9

のために手動で確認

出力は次のとおりです。

input_test: my name is XYZ 
orig_input: my7ameisY- 

バイト最終コードの結果: [b'm', b'y', b'\x01', b'7', b'a', b'm', b'e', b'\x01', b'i', b's', b'\x01', b'\x0b', b'Y', b'-', b'\x05']

潜在的なエラーは何か?

答えて

1

2つの変更が必要です。

  1. ビットを読み取っている間、現在の順序はリトルエンディアンです。それを変換するには、

    reversed(range(8)) 
    

    bits機能で使用されるべきです。

  2. 書き込み時にビットからバイトへの変換中は、ビット列が反転します。それは必要ではありません。だから、コードは

    bytes.append(int(bits[::-1], 2).to_bytes(1, 'little')) 
    

    から

    bytes.append(int(bits, 2).to_bytes(1, 'little')) 
    
への変更します