Python - 二进制到num和num到二进制 - 输出错误

时间:2016-08-10 13:40:30

标签: python-3.x io binary

在处理一些复杂的项目时,我遇到了一个有趣的错误:

代码读取文件,将二进制转换为整数,写入文件。 其他人读取此文件并将整数转换为二进制并写入文件。

理想情况下,输入文件和转换后的文件应该相同。但事情并没有发生。

找到下面的代码:

# 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()

这部分似乎是正确的,我手动检查了a-z,A-Z和0-9

其他机器上的代码执行此操作:

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()

这是输出:

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 个答案:

答案 0 :(得分:1)

需要进行两项修改。

  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'))