【问题标题】:Python - binary to num and num to binary - Wrong OutputPython - 二进制到数字和数字到二进制 - 错误输出
【发布时间】:2016-12-16 22:32:56
【问题描述】:

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

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

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

请在下面找到代码:

# 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']

潜在的错误可能是什么?

【问题讨论】:

    标签: python-3.x io binary


    【解决方案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'))
      

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 2017-09-04
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2012-10-08
      • 2014-01-15
      • 1970-01-01
      相关资源
      最近更新 更多