我正在尝试使用 Python 和 AES 密码来解密图像文件。我们得到了一个 15 字节的 key ,我们的工作就是解密第一个字节的图像。
到目前为止我所拥有的是:
fifteenbytes = b'\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
for i in range(0, 256):
ipack = pack('B', i)
key = ipack + fifteenbytes
我希望我能得到像这样的 key :
\x00\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c
迭代 0 - 255,但我最终得到:
b'\x00~\x15\x16(\xae\xd2\xa6\xab\xf7\x15\x88\t\xcfO<'
或者有时会退出字符和 ascii 值,例如:
b'\t~\x15\x16(\xae\xd2\xa6\xab\xf7\x15\x88\t\xcfO<'
b'%~\x15\x16(\xae\xd2\xa6\xab\xf7\x15\x88\t\xcfO<'
有人可以解释一下为什么会发生这种情况吗?
最佳答案
您得到了正确的输出,但您似乎对 repr()
感到困惑bytes
的输出值。
Python 为您提供了一个可以安全复制并粘贴回 Python session 的值。这有助于调试。此显示尽可能使用 ASCII 可打印文本来表示值,但该值可以通过显示的内容精确再现。
您的期望值b'\x00\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
包含几个可打印的 ASCII 字符,因此 Python 显示这些字符而不是 \xhh
字节值:
>>> output = b'\x00\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
>>> output
b'\x00~\x15\x16(\xae\xd2\xa6\xab\xf7\x15\x88\t\xcfO<'
>>> output == b'\x00\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
True
字节串仍然是 16 个字节长:
>>> len(output)
16
那个~
是 ASCII 代码点 126,或十六进制的 0x7E:
>>> output[1]
126
>>> hex(output[1])
'0x7e'
这同样适用于\x28
和(
, \x09
和\t
(制表符转义序列),\x4f
和O
,和\x3c
和<
.
\xhh
转义序列只是 bytes
中的符号。对象文字来定义给定的字节值,但您可以使用 ~
生成完全相同的值。 \t
同上,您可以将相同的值表示为 \x09
,但 Python 更喜欢使用 \t
显示表示时的顺序。
关于Python - 连接字节到字符串,切断字符串中的一些字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39666422/