将文本转换为十进制 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
应该 从理论上讲,return 为一个有效的一个正确的单位值列表其范围内的整数。它通过将整数除以 2 直到剩下 0 来计算此列表。
但是
从 Python 2.7 到 3.x 的更重要的 变化 之一是 division operator 的行为。之前,这总是 returned 一个整数,但是对于 Python 3,决定将其 return 改为一个浮点数。
这意味着简单的位计算循环
while n > 0:
result = [(n % 2)] + result
n = n / 2
不再 return 0
和 1
的稳定列表,总是结束,因为源整数用完了数字,但你得到的是超过一千个浮点数的列表。乍一看可能不清楚该列表代表什么,但它以
结尾
… 1.03125, 0.0625, 0.125, 0.25, 0.5, 1]
你可以看到它是除以二的循环,一直在除法直到它的输入最终用完浮点精度并停止进一步分裂。
结果数组不仅比下一个例程预期的要大得多,它的数据也是错误的类型。此列表中的值用作代码顶部 BITS
元组的索引。使用浮点除法,尝试使用该值作为索引时会出现错误,即使它是一个循环 0.0
或 1.0
。整数除法再次解决了这个问题。
我需要将单词转换为 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
应该 从理论上讲,return 为一个有效的一个正确的单位值列表其范围内的整数。它通过将整数除以 2 直到剩下 0 来计算此列表。
但是
从 Python 2.7 到 3.x 的更重要的 变化 之一是 division operator 的行为。之前,这总是 returned 一个整数,但是对于 Python 3,决定将其 return 改为一个浮点数。
这意味着简单的位计算循环
while n > 0:
result = [(n % 2)] + result
n = n / 2
不再 return 0
和 1
的稳定列表,总是结束,因为源整数用完了数字,但你得到的是超过一千个浮点数的列表。乍一看可能不清楚该列表代表什么,但它以
… 1.03125, 0.0625, 0.125, 0.25, 0.5, 1]
你可以看到它是除以二的循环,一直在除法直到它的输入最终用完浮点精度并停止进一步分裂。
结果数组不仅比下一个例程预期的要大得多,它的数据也是错误的类型。此列表中的值用作代码顶部 BITS
元组的索引。使用浮点除法,尝试使用该值作为索引时会出现错误,即使它是一个循环 0.0
或 1.0
。整数除法再次解决了这个问题。