如何将由各种ASCII码组成的int值转换为其对应的字串?

时间:2019-03-24 14:09:37

标签: python

说我有很多ASCII码加入一个int值。例如-我的名字“ Rahul”产生8297104117108(x =''.join(str(ord(c))for c in "Rahul")。如何将该整数转换回使用ASCII码形成的单词?

3 个答案:

答案 0 :(得分:2)

如果将其限制为8位字符集(扩展的ASCII)中的可打印字符(ascii> = 32),则实际上没有歧义。每个字符将使用2或3位数字。具有两位数字的字符将为> = 32,具有3位数字的字符将为<= 255(恰好以低于32的两位数字开头)。因此,连续的两个数字<32只能是3位数字符的开头。

def decodeStr(s):
    if s == "": return ""
    code = s[:3] if s[:2] < "32" else s[:2]
    return chr(int(code)) + decodeStr(s[len(code):])

sa = decodeStr("8297104117108")
print(sa) # "Rahul"

如果要解码的字符串很长,则递归方法可能会达到Python的最大递归限制。这是该函数的迭代变体:

def decodeStr(s):
    result = ""
    code   = ""
    for digit in s:
        code += digit
        if len(code) < 2 or code < "32" : continue
        result += chr(int(code))
        code = ""
    return result

迭代函数的运行速度比递归函数快1.8倍。

答案 1 :(得分:1)

这是一个简单但不是很有效的解决方案:

d = '8297104117108'
l = []
while d:
    if d[0] == '1':
        l.append(chr(int(d[:3])))
        d = d[3:]
    else:
        l.append(chr(int(d[:2])))
        d = d[2:]
print(''.join(l))

这假设您的字符范围非常有限,如果您可以破坏“加密”,则将数字的长度设为3。像这样:

my_code = ''.join('{:03}'.format(ord(c))for c in "Rahul")

这将给您'082097104117108',然后您可以一次阅读3

''.join([chr(int(my_code[i:i+3])) for i in range(0,len(my_code),3)])

答案 2 :(得分:0)

假定所有代码都在range(65,650)中的增量解决方案,因此您可以将文本扩展到所有拉丁扩展名:

def decode(code):
    res=''
    car=0
    for digit in code:
         car = 10*car + int(digit)
         if car >= ord('A'):
             res += chr(car)
             car=0
    return res

decode('8297104117108')'Rahul'decode('8297250108')'Raúl'