python int to char to string conversion

时间:2015-01-13 14:02:36

标签: python string char type-conversion

我正在学习加密课程,我设法将一串十六进制值转换为它们的int等价物。我知道想要使用chr(x)函数将它们转换为它们的char等效函数,该函数从0到255获取并返回相应的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。但是当我将其附加到"结果"字符串似乎改变了。当我打印"结果"在最后一行中,我的字符串的第一个字符不是' 1'。

有什么想法吗?现在把我的头猛干了2天,直到我设法用我的加密代码跟踪这几行的问题。

干杯

2 个答案:

答案 0 :(得分:0)

您可以使用生成器表达式,然后使用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ïó>'

答案 1 :(得分:0)

您的代码是正确的。输出刚刚被破坏,因为在正在使用的编码中,一些后续字符(即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�^�…