2012-06-15 2 views
0

питона 2,7новообращенный INT в строку, которая содержит только строчные буквы и цифры и обратно (питон)

как вы взять любое число и быть в состоянии сжать его только строчные буквы и цифры? и как вы берете полученную строку и возвращаете ее к номеру?

Выполнение чего-то вроде chr() для каждого блока чисел из 3-х чисел не будет работать, потому что, если блок числа больше 255, он выдаст ошибку, и мне нужны только строчные буквы и буквы.

редактировать:

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

+0

Укажите пример использования? То есть каков вход и ожидаемый результат этой операции? – millimoose

+1

Я думаю, что только прописные буквы будут лучше, чем только строчные. Оба имеют примерно одинаковое количество столкновений (например, l = 1, O = 0), но строчные буквы различаются по высоте, что затрудняет сохранение вашего места при вводе текста. Вот почему большинство анти-пиратских кодов используют верхний регистр. – abarnert

+1

Кроме того, большинство людей не используют базу-36 из-за этих столкновений. Конечно, детали зависят от вашего шрифта, но обычно лучше пропустить хотя бы I и O (для верхнего регистра) или l и o (для нижнего регистра). Тем не менее, принцип использования base-36 (как показано на рисунке F.J.) - это то же самое, он просто базовый-34, и для изменения кода требуется несколько минут. – abarnert

ответ

6

Использование base 36, ниже адаптировано версия реализации Python, которые вы можете найти в Википедии:

def base36encode(number, alphabet='abcdefghijklmnopqrstuvwxyz'): 
    """Converts an integer to a base36 string.""" 
    if not isinstance(number, (int, long)): 
     raise TypeError('number must be an integer') 

    base36 = '' if number != 0 else '0' 
    sign = '' 
    if number < 0: 
     sign = '-' 
     number = -number 

    while number != 0: 
     number, i = divmod(number, len(alphabet)) 
     base36 = alphabet[i] + base36 

    return sign + base36 

def base36decode(number): 
    return int(number, 36) 

>>> print base36encode(1412823931503067241) 
aqf8aa0006eh 
>>> print base36decode('aqf8aa0006eh') 
1412823931503067241 
+0

+1. Вы должны упомянуть верхний и нижний методы в строках как способ их адаптации, поэтому ясно, насколько это не сложно. – abarnert

+0

Не обращайте внимания на приведенный выше комментарий - ваше редактирование означает, что ему больше не нужно вызывать base36encode (n) .lower(). – abarnert

+0

@QxQ: вы можете сделать результат еще проще для ввода, используя меньший алфавит, например, буквы в домашнем ряду на QWERTY-клавиатуре, хотя, скорее всего, это будет больше для ввода. – martineau

0

str.lower() делает строку в нижнем регистре ул. Кроме того, вы можете использовать regex, чтобы находить буквы/слова и цифры, но вопрос не очень ясен, поэтому я не уверен, что вы имеете в виду.

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