在处理一些复杂的项目时,我遇到了一个有趣的错误:
代码读取文件,将二进制转换为整数,写入文件。 其他人读取此文件并将整数转换为二进制并写入文件。
理想情况下,输入文件和转换后的文件应该相同。但事情并没有发生。
找到下面的代码:
# 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']
可能是什么潜在错误?
答案 0 :(得分:1)
需要进行两项修改。
在读取位时,当前顺序是小端。转换它,
reversed(range(8))
应该在bits
函数中使用。
在写入时从位转换为字节时,位串被反转。这不是必需的。所以代码从
更改bytes.append(int(bits[::-1], 2).to_bytes(1, 'little'))
到
bytes.append(int(bits, 2).to_bytes(1, 'little'))