使用ord函数对文件进行编码



我试图对一个文件进行编码,并将编码输出到一个新文件中,但我遇到了以下错误:

TypeError: ord() expected string of length 1, but int found

我的代码:

from sys import argv, exit

def encode(data):
encoded = ''
while data:
current = data[0]
count = 1
for i in data[1:]:
if i == current:
count += 1
else:
break
if count == 255:
break
encoded += '{}{}'.format(chr(ord(current) & 255), chr(count & 255)) #error occurs here.
data = data[count:]
return encoded

if __name__ == '__main__':
if len(argv) < 2:
print('Please specify input file!')
exit(0)
with open(argv[1], 'rb') as (f):
data = f.read()
with open(argv[1] + '.out', 'wb') as (f):
f.write(encode(data))

附加问题:如何解码编码文件?

您正在读取字节(open(..., 'rb')(,因此当您获取字节字符串的一个元素时,您将获得一个字节,即一个数字。这个数字已经是字符代码了,所以去掉ord。或者,您可以在不使用b修饰符(open(..., 'r')(的情况下打开文件,该修饰符将返回一个字符串;不过,我建议将其保留为字节字符串(或者,如果解析非ascii内容,可能会遇到编码问题(。

保存文件时会遇到类似的问题:无法将字符串写入用b修饰符打开的文件中。由于您的字符超出了ascii范围(>128(,所以作为字符串编写不是一个好主意,因为python会尝试对您的字符进行编码(例如,UTF-8(,最终会得到完全不同的字节。因此,最好的解决方案可能不是将数据连接到循环中的字符串(执行'{}{}'.format(...)的部分(,而是有一个列表(encoded = [],与encoded.append(current)连接(,并在循环后使用bytes(encoded)将其转换为字节字符串。然后,您可以毫无问题地将其传递给write

至于如何解码文件,您可以像编码一样打开文件,读取两个字节b1b2,并将[b1]*b2附加到输出中(再次作为列表(,然后使用bytes()将其转换为字节字符串。

最新更新