[英]How can I work around (or with) this function returning hexadecimal characters when I don't want it to? (Python 3)
我编写了一个加密函数,它通过对明文中的字母和密钥中的相应字母执行 XOR 函数来工作。 请看下面的代码:
def vernam(y):
ciphertext = "" # this declares the ciphertext variable
vernamkey = []
for letter in y:
individualletterkey = secrets.choice(string.ascii_letters) # this generates a different key for each letter
vernamkey.append(individualletterkey)
newletter = chr(ord(letter) ^ ord(individualletterkey))
print(newletter)
ciphertext += newletter
for element in vernamkey: # this loop ensures that the key for every letter is in a text file that can be passed
# on to the intended recipient for them to decrypt
vkey.write(str(element))
vkey.write("\n")
return ciphertext
虽然 encrypt 函数有效,但对于 pycharm(我的 IDE)似乎无法表示的某些 unicode 字符,返回的密文中包含十六进制:
Enter the message to be encrypted Hello world
8
?
;
l
=
6
('\x01\x178?;l\x07\x00=\x0e6')
如您所见,对于密文中的某些字符,我假设使用了一种占位符。 然后这些字符在底部的最终输出密钥中表示为十六进制。 这是一个问题,因为我希望使用此密钥来解密此文本,并且要做到这一点,必须发生以下两件事之一:
将十六进制转换为最终密钥中的 unicode 字符。 不确定这是否明智,因为多个不同的字符将由相同的答案表示
让解密算法识别文本中的十六进制字符并自行将其转换为 unicode
我将如何完成其中任何一项?
您描述的问题的核心是您对 Python 中的变量类型以及用于存储在文件中的文本/字符串编码的混淆。
Python 字符串包含 Unicode 字符,字节字符串包含范围 (0,255) 内的 ASCII 代码/整数,依此类推。 让我们从评论中链接到您的问题的演示文稿中放一些 Unicode 乐趣,我鼓励您阅读:
ℛℯα∂α♭ℓℯ ♭ʊ☂ η☺т Ѧ$☾ℐℐ ¡ooʇ ןnɟǝsn sı uʍop-ǝpısdn
一旦你清楚你想要达到什么目标,困惑就会消失,你可以提出正确的问题。 我建议你考虑研究一下如何在 Unicode 和字节之间进行转换,以及 UTF-8、UTF-16 等是什么。
这个事实通常是为什么这个问题在这么多人中造成如此严重的困惑的原因。 例如,如果您在文本编辑器中看到下一行,您通常看不到换行符是由两个字符组成(如果您使用 MS Windows,则为默认值)或只有一个字符(在 Unix/Linux 系统中为默认值) . 与在文件中编码和存储文本以及在文本编辑器中查看文本相关的问题并非易事,需要深入了解。
很抱歉,没有办法学习如何指定和使用编码来写入和读取文件(除非您总是希望依赖外部帮助)。
如果没有加密代码和解密代码,以及写入文件和读取文件的代码,就很难判断事情是否会按预期进行。
困惑已经从一个问题开始:如何读取存储在文件中的文本并将其解码为 Python 变量? 有字节吗? 文件中是否存储了 Unicode UTF-8 或 UTF-16 字符? 还是使用了代码页?? 使用哪种编码写入文件? 使用哪种编码从文件中读取?
您似乎没有意识到上述所有这些问题。 但是,如果出现问题,您应该了解如何解决它们。
开始学习编码的一个好点是访问这个stackoverflow 问题(如何知道 Python 中文件的编码?[重复] )我使用搜索引擎和关键字发现:'python 文件编码'或这个:什么是字符编码,我为什么要打扰它。
我已经在stackoverflow上写了关于编码的主题(在stackoverflow自己的搜索中使用'user:7711283 encoding'来搜索8个结果的完整列表)。 看这里(如果您在 Python(或文件)中有一个字符串/文本,您将永远无法“按原样”看到它)。 您越了解为什么您永远无法“按原样”看到字符串,您就越不会对所看到的内容感到困惑。 也看这里(没有办法避免编码/解码,但有一种方法可以以不明确的方式进行。)
下一步是找出在保存或加载 Python 脚本或文本时使用文本编辑器的文件编码,以帮助您解释您在编辑器中实际看到的内容。 以下提示在何处查找此信息:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.