Python 3.x 什么';在这个Python加密脚本中到底发生了什么?

Python 3.x 什么';在这个Python加密脚本中到底发生了什么?,python-3.x,encryption,binary,binaryfiles,Python 3.x,Encryption,Binary,Binaryfiles,我目前正在学习将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() f

我目前正在学习将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)
FILENAME='pc\u rose\u copy.txt'
def显示内容(文件名):
fp=打开(文件名为“rb”)
打印(fp.read())
fp.close()
def加密(文件名):
fp=打开(文件名为“r+b”)
text=fp.read()
fp.seek(0)
对于文本中的c:

如果c我认为加密函数也意味着解密函数。 加密从文本文件转到只有高字节的二进制文件。但是else子句用于从高字节返回到文本。我认为,如果您添加了一个额外的
加密(文件名)
,您将获得原始文件


在文本文件中,“c”不能真的是128。最大值为126(~),127是
del
“字符”。但是c=128,加128作为字节,当我们以256模工作时,将是0(环绕)。在C语言中,情况就是这样(对于无符号字符)。

真正发生的是脚本正在切换每个字节的最高有效位。这相当于对每个字节加/减128。您可以通过在运行脚本之前/之后查看文件内容(linux或mac上的
xxd-b file.txt
将让您查看确切的位/字节)来了解这一点

下面是一些示例文本的运行:

之前的文件内容:

11110000 10011111 10011000 10000100 00001010
01110000 00011111 00011000 00000100 10001010
之后的文件内容:

11110000 10011111 10011000 10000100 00001010
01110000 00011111 00011000 00000100 10001010
运行脚本两次(或任意偶数次),通过将所有高位切换回原始值来恢复原始文本

问题/答案:

11110000 10011111 10011000 10000100 00001010
01110000 00011111 00011000 00000100 10001010
1) 如果文件是ASCII编码的,则为“是”。e、 g.对于文件
abc\n
c
的值分别为97、98、99和10(换行符)。您可以通过在循环中添加
print(c)
来验证这一点。此脚本也适用于*非ASCII编码的文件(上面的例子是UTF-8)

2) 这样我们就可以翻转位了。即使我们只处理ASCII文件(这不能保证),加密ASCII文件得到的字节也将大于128,因为我们在每个字节中添加了128个字节。所以我们仍然需要处理这种情况,以便解密我们自己的文件


3) 按原样,脚本崩溃,因为
bytes()
需要范围
0 128.txt
中的值。脚本应该在#2:Python如何知道您正在向它提供一个纯ASCII文件?如果你的问题是“为什么我需要加这样一张支票”,那么,无论如何,把它去掉。这个问题的所有答案都遗漏了一个关键点,我认为这会妨碍你的理解<这里的code>c
不是字符。它是一个字节。因此,例如,如果文件包含字符“Python将很高兴地将128添加到128–但此时,转换回一个字符,Python 2将抱怨
chr()arg不在范围(256)
.Python 3(OP正在使用的)如果字符串被转换为文本字符串,则会将其转换为Unicode字符
U+0100
。如果它是
bytearray
对象,则会得到(预期的)错误
字节必须在(0,256)
范围内。已修复。我认为“first”对于文章中的示例来说希望是明确的(因为很清楚哪个位在变化)但如果只是为了避免与endian相关的混淆,MSB/LSB术语肯定会更好。
:)
更好。我会给你一个向上投票的机会,除了我第一次已经这么做了。所以这里还有一些东西要给你: