我目前正在学习如何使用Python处理二进制文件。我在我正在读的书中偶然发现了这段代码:
FILENAME = 'pc_rose_copy.txt'
def display_contents(filename):
fp = open(filename, 'rb')
print(fp.read())
fp.close()
def encrypt(filename):
fp = open(filename, 'r+b')
text = fp.read()
fp.seek(0)
for c in text:
if c <= 128:
fp.write(bytes([c+128]))
else:
fp.write(bytes([c-128]))
fp.close()
display_contents(FILENAME)
encrypt(FILENAME)
display_contents(FILENAME)
我对这段代码有几个疑问,我在书中找不到答案:
1)在第13行("if c ord 128"),由于文件是以二进制模式打开的,因此每个字符都作为其在ASCII表中的索引被读取(即,如果文件没有处于二进制模式,则等同于'if <= (C) <= 128‘)?
2)如果是,那么检查是否有任何角色的索引高于128有什么意义,因为这是一段来自罗密欧与朱丽叶的.txt?
3)这一点更多的是出于好奇,所以请原谅我的天真。我知道这在这种情况下不适用,但是假设脚本遇到一个字节值为128的'c‘,因此将128加到它上面。256字节会是什么样子的--是11111111 00000001吗?
发布于 2018-07-19 06:41:36
我认为加密函数也应该是一个解密函数。加密从文本文件转换为只有高字节的二进制文件。但是else子句用于从高字节返回到文本。我认为如果你添加一个额外的encrypt(FILENAME)
,你会得到原来的文件。
在文本文件中,“c”不能真正是128。最大值为126 (~),127是del
“字符”。但是当我们以256为模工作时,c=128和添加128作为字节将是0(绕回)。在C中,情况就是这样(对于无符号字符)。
https://stackoverflow.com/questions/51411727
复制相似问题