python 成to char转字符串

python into to char to string coversion

我正在学习密码学课程,我设法将一串十六进制值转换为它们的 int 等价物。我知道想使用 chr(x) 函数将它们转换为它们的等效字符,该函数采用 0-255 之间的数字和 returns 相应的 ASCII 值。然后我想把所有这些都作为一个字符串显示。

这是一些简单的代码:

x = [49, 21, 92, 196, 78, 238, 234, 170, 168, 139, 181, 95, 248, 138, 170, 175, 249, 145, 23, 116, 65, 20, 69, 91, 191, 244, 67, 62, 225, 23, 120, 132, 75, 184, 143, 250, 160, 0, 13, 220, 199, 113, 29, 216, 136, 133, 90, 168, 128, 4, 78, 229, 94, 238, 233, 159, 250, 164, 64, 11, 177, 22, 99, 52, 73, 156, 193, 20, 70, 111, 251, 183, 119, 120, 140, 205, 223, 242, 45, 211, 58, 175, 255, 240, 2, 33, 29, 223, 255, 255, 245, 91, 180, 64, 3, 59, 181, 81, 16, 13, 208, 13, 208, 4, 69, 85, 84, 70, 104, 138, 174, 235, 185, 152, 134, 98, 34, 43, 177, 19, 55, 125, 218, 174, 232, 133, 87, 117, 85, 83, 60, 204, 205, 216, 136, 136, 131, 58, 167, 123, 188, 195, 55, 117, 82, 32, 14, 224, 6, 110, 229, 81, 21, 93, 210, 34, 44, 201, 149, 84, 78, 235, 186, 165, 80, 2, 37, 91, 184, 140, 204, 197, 87, 126, 238, 229, 89, 148, 65, 24, 140, 206, 231, 125, 220, 198, 107, 188, 196, 65, 21, 85, 86, 107, 189, 219, 179, 54, 107, 187, 188, 202, 163, 62, 232, 135, 119, 116, 67, 48, 1, 31, 251, 188, 202, 170, 163, 59, 184, 131, 59, 178, 34, 32, 8, 128, 9, 149, 86, 96, 9, 152, 135, 120, 129, 21, 95, 246, 101, 82, 40, 134, 103, 118, 100, 71, 112, 3, 61, 222, 224, 15, 243, 61, 213, 82, 36, 68, 64, 0, 10, 161, 25, 155, 177, 21, 89, 150, 97, 16, 11, 177, 17, 30, 239, 243, 62]

result = ""
for i in x:
    print chr(i)
    result = result + chr(i)
print result

令我困惑的是,当我执行 "print chr(i)" 时,我得到字符“1”,它是 42 的 ASCII。但是,当我将其附加到 "result" 字符串时,它似乎发生了变化。当我在最后一行打印 "result" 时,我的字符串的第一个字符不是“1”。

有什么想法吗?现在绞尽脑汁 2 天,直到我设法将我的加密代码的问题追踪到这几行。

干杯

您可以使用生成器表达式,然后 join 创建单个字符串

>>> ''.join(chr(i) for i in x)
'1\x15\ÄNîꪨ\x8bµ_ø\x8aª¯ù\x91\x17tA\x14E[¿ôC>á\x17x\x84K¸\x8fú\xa0\x00\rÜÇq\x1dØ\x88\x85Z¨\x80\x04Nå^îé\x9fú¤@\x0b±\x16c4I\x9cÁ\x14Foû·wx\x8cÍßò-Ó:¯ÿð\x02!\x1dßÿÿõ[´@\x03;µQ\x10\rÐ\rÐ\x04EUTFh\x8a®ë¹\x98\x86b"+±\x137}Ú®è\x85WuUS<ÌÍØ\x88\x88\x83:§{¼Ã7uR \x0eà\x06nåQ\x15]Ò",É\x95TN뺥P\x02%[¸\x8cÌÅW~îåY\x94A\x18\x8cÎç}ÜÆk¼ÄA\x15UVk½Û³6k»¼Ê£>è\x87wtC0\x01\x1fû¼Êª£;¸\x83;²" \x08\x80\t\x95V`\t\x98\x87x\x81\x15_öeR(\x86gvdGp\x03=Þà\x0fó=ÕR$D@\x00\n¡\x19\x9b±\x15Y\x96a\x10\x0b±\x11\x1eïó>'

您的代码是正确的。输出只是被破坏了,因为在使用的编码中,一些后续字符(即 after the 1)是控制字符,这导致先前写入的输出是当打印到终端时被覆盖。

您可以通过查看字符串中是否包含控制字符来轻松验证这一点:

import curses.ascii

num_ctrl = len(filter(curses.ascii.iscntrl, result))
# num_ctrl = 41

此外,您可以使用以下代码片段检查您正在处理的控制字符:

control_chars = [curses.ascii.controlnames[ord(x)] for x in result if curses.ascii.isctrl(x)]
# control_chars = ['NAK', 'ETB', …]

你可以查一下in the documentation的意思。特别要注意,您的字符串包含 BS 控制序列,它对应于退格键。

最后,您可以过滤掉控制字符并只打印剩余部分:

print ''.join([x for x in result if not curses.ascii.isctrl(x)])
# 1\�N�ꪨ��_��tAE[��C>�x�K�����q؈�Z��N�^�…