Преобразовать текст в десятичный Python3 - PullRequest
0 голосов
/ 13 ноября 2018

Мне нужно преобразовать слова в числа для шифра RSA, поэтому я нашел код, который может преобразовывать текст в десятичную, но когда я запускаю его в терминале через python 3, я получаю:

Traceback (most recent call last):
  File "test.py", line 49, in <module>
    numberOutput = int(bit_list_to_string(string_to_bits(inputString)),2) #1976620216402300889624482718775150
  File "test.py", line 31, in string_to_bits
    map(chr_to_bit, s)
  File "test.py", line 30, in <listcomp>
    return [b for group in
  File "test.py", line 29, in chr_to_bit
    return pad_bits(convert_to_bits(ord(c)), ASCII_BITS)
  File "test.py", line 14, in pad_bits
    assert len(bits) <= pad
AssertionError

при использовании"python convert_text_to_decimal.py" в терминале работает правильно.

Код:

BITS = ('0', '1')
ASCII_BITS = 8

def bit_list_to_string(b):
    """converts list of {0, 1}* to string"""
    return ''.join([BITS[e] for e in b])

def seq_to_bits(seq):
    return [0 if b == '0' else 1 for b in seq]

def pad_bits(bits, pad):
    """pads seq with leading 0s up to length pad"""
    assert len(bits) <= pad
    return [0] * (pad - len(bits)) + bits

def convert_to_bits(n):
    """converts an integer `n` to bit array"""
    result = []
    if n == 0:
        return [0]
    while n > 0:
        result = [(n % 2)] + result
        n = n / 2
    return result

def string_to_bits(s):
    def chr_to_bit(c):
        return pad_bits(convert_to_bits(ord(c)), ASCII_BITS)
    return [b for group in
            map(chr_to_bit, s)
            for b in group]

def bits_to_char(b):
    assert len(b) == ASCII_BITS
    value = 0
    for e in b:
        value = (value * 2) + e
    return chr(value)

def list_to_string(p):
    return ''.join(p)

def bits_to_string(b):
    return ''.join([bits_to_char(b[i:i + ASCII_BITS])
        for i in range(0, len(b), ASCII_BITS)])

inputString = "attack at dawn"
numberOutput = int(bit_list_to_string(string_to_bits(inputString)),2) #1976620216402300889624482718775150

bitSeq = seq_to_bits(bin(numberOutput)[2:]) #[2:] is needed to get rid of 0b in front
paddedString = pad_bits(bitSeq,len(bitSeq) + (8 - (len(bitSeq) % 8))) #Need to pad because conversion from dec to bin throws away MSB's
outputString = bits_to_string(paddedString) #attack at dawn

Поэтому, когда я использую только python, у него есть версия 2.7.Пожалуйста, помогите мне исправить этот код в Python 3

1 Ответ

0 голосов
/ 13 ноября 2018

Измените строку 22,

n = n / 2

на

n = n // 2

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


Вы получаете ошибку подтверждения, потому что функция convert_to_bits должна теоретически возвращать правильный список значений одного бита для действительногоцелое число в его диапазоне.Он рассчитывает этот список путем деления целого числа на 2 до тех пор, пока не останется 0.

Однако.

Одним из наиболее значительных изменений с Python 2.7 до 3.x было поведение оператора деления .До этого всегда возвращалось целое число, но в Python 3 было решено вернуть вместо него число с плавающей точкой.

Это означает, что простой цикл вычисления битов

while n > 0:
    result = [(n % 2)] + result
    n = n / 2

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

… 1.03125, 0.0625, 0.125, 0.25, 0.5, 1]

, вы можете видеть, что это цикл деления на два, который продолжает делить до его ввода наконец истекает с точностью с плавающей запятой и прекращает деление дальше.

Полученный массив не только намного больше, чем ожидают следующие подпрограммы, его данные также неверны тип .Значения в этом списке используются в качестве индекса для кортежа BITS в верхней части вашего кода.С делением с плавающей запятой вы получаете ошибку при попытке использовать значение в качестве индекса, даже если это раунд 0.0 или 1.0.Целочисленное деление, опять же, исправляет это.

...