你如何解码一个三元字符串(或任何不寻常的基数)?
How do you decode a string in ternary (or any unusual base)?
对于二进制、四进制、八进制和十六进制,我很清楚如何将它们的流转换为纯文本。任何人都可以帮助我理解我应该如何为三元、五元、senary 和其他基地做这件事? (Here 是一个三元示例,python 脚本将不胜感激)
到目前为止,我已经尝试过:
- 将每个数字解码为其对应的二进制数字,
0->00
、1->01
和 2->10
- 创建 3 个字符的块并将它们映射到也不起作用的英文字母表:
000->a
、001->b
等等直到 221->z
这是我的代码:
from numpy import *
import binascii
base =3
base_data = ''
with open ("./base%s"%base,'r') as b3:
for line in b3:
base_data = base_data + line.strip('\r\n')
output = []
all_nums_in_base = range(base)
list_chars = list(base_data)
final = ''
for char in list_chars:
if char == '0':
output += ['0']
elif char == '1':
output += ['1']
elif char == '2':
output += ['1','0']
output = ''.join(output)
n = int('ob'+output,2)
print binascii.unhexlify('%x' % n)
我的结果是这种格式:
JMN4,�J�j�T*2VYI�F�%��TjYCL���Y�E�&�
�I��̚dYCL�Z�
�K*�թ��-P��Qie�K"q�jL��5j�Y���K0�C�K2i�f�
使用您的示例数据(此处缩写):
> s = '''010020010202011000010200011010011001010202001012...'''
> ''.join(chr(int(s[i:i+6], 3)) for i in range(0, len(s), 6))
=> 'Welcome to base 3!\nLorem ipsum dolor sit amet, consectetur ...'
我猜它用六个三进制数字对每个字符进行编码,因为您的示例数据的长度是 6 的倍数,而 36 是大于或等于的 3 的最小幂28.
对于二进制、四进制、八进制和十六进制,我很清楚如何将它们的流转换为纯文本。任何人都可以帮助我理解我应该如何为三元、五元、senary 和其他基地做这件事? (Here 是一个三元示例,python 脚本将不胜感激) 到目前为止,我已经尝试过:
- 将每个数字解码为其对应的二进制数字,
0->00
、1->01
和2->10
- 创建 3 个字符的块并将它们映射到也不起作用的英文字母表:
000->a
、001->b
等等直到221->z
这是我的代码:
from numpy import *
import binascii
base =3
base_data = ''
with open ("./base%s"%base,'r') as b3:
for line in b3:
base_data = base_data + line.strip('\r\n')
output = []
all_nums_in_base = range(base)
list_chars = list(base_data)
final = ''
for char in list_chars:
if char == '0':
output += ['0']
elif char == '1':
output += ['1']
elif char == '2':
output += ['1','0']
output = ''.join(output)
n = int('ob'+output,2)
print binascii.unhexlify('%x' % n)
我的结果是这种格式:
JMN4,�J�j�T*2VYI�F�%��TjYCL���Y�E�&�
�I��̚dYCL�Z�
�K*�թ��-P��Qie�K"q�jL��5j�Y���K0�C�K2i�f�
使用您的示例数据(此处缩写):
> s = '''010020010202011000010200011010011001010202001012...'''
> ''.join(chr(int(s[i:i+6], 3)) for i in range(0, len(s), 6))
=> 'Welcome to base 3!\nLorem ipsum dolor sit amet, consectetur ...'
我猜它用六个三进制数字对每个字符进行编码,因为您的示例数据的长度是 6 的倍数,而 36 是大于或等于的 3 的最小幂28.