繁体   English   中英

将文本转换为十进制python3

[英]Convert text to decimal python3

我需要将单词转换为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

更改第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 s和1 s的稳定列表,总是结束,因为源整数用完了数字,但是相反,您得到的列表包含一千多个浮点数。 乍一看,可能不清楚该列表代表什么,但最终以

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

您会看到一直被除以二的循环,直到其输入最终超出浮点精度并停止进一步除法为止。

结果数组不仅比下一个例程期望的要大得多,而且它的数据类型也不正确。 此列表中的值用作代码顶部的BITS元组的索引。 使用浮点除法,即使将值舍入为0.01.0 ,您在尝试将该值用作索引时也会出错。 整数除法再次解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM