2015-07-29 2 views
0

Есть метод, который преобразует строку текста, такого как 'you' к ряду других, чемСтрока текста для уникального целочисленного метода?

y = tuple('you') 
for k in y: 
    k = ord(k) 

который только преобразует один символ за один раз?

+0

Вы должны быть в состоянии получить текст обратно после его преобразования. – user4757074

+0

Получите текст обратно из целого числа? Это возможно, но это звучит как [проблема X-Y] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), чего именно вы пытаетесь достичь? –

ответ

4

Для того, чтобы преобразовать строку в число (и наоборот), вы должны всегда всегда работать с bytes. Поскольку вы используете Python 3, строки на самом деле являются строками Unicode и могут содержать символы, которые имеют значение ord() выше 255. bytes однако имеют только один байт на символ; поэтому сначала вы должны преобразовать эти два типа.

В принципе, вы ищете способ преобразования строки bytes (которая в основном представляет собой список байтов, список чисел 0-255) в одно число и обратное. Вы можете использовать int.to_bytes и int.from_bytes для этого:

import math 
def convertToNumber (s): 
    return int.from_bytes(s.encode(), 'little') 

def convertFromNumber (n): 
    return n.to_bytes(math.ceil(n.bit_length()/8), 'little').decode() 
>>> convertToNumber('foo bar baz') 
147948829660780569073512294 
>>> x = _ 
>>> convertFromNumber(x) 
'foo bar baz' 
1
  1. Вам не нужно, чтобы преобразовать строку в кортеж
  2. k перезаписывается. Собирать предметы, используя что-то вроде списка понимания:

>>> text = 'you' 
>>> [ord(ch) for ch in text] 
[121, 111, 117] 

Чтобы получить текст обратно, используйте chr и присоединиться символы с помощью str.join:

>>> numbers = [ord(ch) for ch in text] 
>>> ''.join(chr(n) for n in numbers) 
'you' 
+0

Я искал одно число, а не список чисел, представляющих целое слово. – user4757074

0

Обработать строку как число базовых 255.

# Reverse the digits to make reconstructing the string more efficient 
digits = reversed(ord(b) for b in y.encode()) 
n = reduce(lambda x, y: x*255 + y, digits) 

new_y = "" 
while n > 0: 
    n, b = divmod(n, 255) 
    new_y += chr(b) 
assert y == new_y.decode() 

(Обратите внимание, это, по существу, такой же, как ответ тыкать, но написано явно, а не использовать доступные методы для преобразования строки байтов и целое число.)

Смежные вопросы