任意基础二进制到文本编码器(任意基础到任意基础)
项目描述
最基础的蟒蛇
Python 中的任意基础二进制到文本编码器(任意基础到任意基础)。
什么?
简而言之,basest基于(双关语肯定是:wink:) 二进制到文本转换的概念,即将二进制或 8 位数据转换或序列化为可以安全传递的基于文本的表示格式通过否则会破坏或破坏二进制数据含义的介质。
这个概念在电子邮件、PDF 格式和公钥密码学等领域非常常用,仅举几例。
有许多不同的格式和方案用于将二进制数据序列化为文本,采用不同的字母大小和用于各种不同原因的不同可打印 ASCII 字符。
它也不仅仅是可以序列化的 8 位二进制数据。任何声明为给定数字基数或字母大小的符号集合都可以序列化为任何其他符号,前提是可以建立两个符号之间的编码比率并定义输入和输出符号。
这个库是我实现的一个通用的、base-to-base 转换器,它解决了最后一点。可以创建当前存在的每种二进制到文本格式的编码器和解码器,并与该库一起使用,只需要给出所需格式的详细信息。由于它的灵活性,该库还使得发明新的美妙而有趣的 base-to-base 序列化/转换格式变得轻而易举(我本人计划开发并发布一种将二进制文件转换为纯粹基于表情符号的格式!)。
该库的一个限制是它不能将数据从较小的输入基数编码到较大的输出基数并在输入上进行填充(即,如果您要从基数 2 编码到基数 1000,则需要确保输入符号的数量与您使用的编码比率完全匹配)。这是一个公认的限制,因为实现填充系统的复杂性与 base-64 和其他系统的工作方式相同,但可以扩展到任何任意基础。
所以,我希望你觉得这个库很有趣,有用或两者兼而有之!
安装
支持的 Python 版本
该库旨在与Python 2.7和Python 3.3或更高版本一起使用。
它针对 Python 2.7、3.5、3.6和PyPy 3.5进行了测试。
:bulb:需要帮助
如果您已经尝试或想要在任何其他 Python 实现上尝试此操作,我们将非常感谢您的反馈!
如果您有兴趣,请打开一个问题。
从 PyPi 安装(首选)
pip install basest
从 git 存储库安装(来自开发分支的前沿副本)
pip install git+git://github.com/saxbophone/basest-python@develop
用法
以下是此库中定义的接口的简短概述,从何处导入它们以及如何使用它们。
有一个功能接口和一个基于类的接口(基于类的接口是在功能接口上的捎带,但将来也将用于添加附加功能)。
基于类的接口
要使用基于类的接口,您需要创建一个子类basest.encoders.Encoder并覆盖该类的属性,如下所示(以 base64 为例):
from basest.encoders import Encoder
class CustomEncoder(Encoder):
input_base = 256
output_base = 64
input_ratio = 3
output_ratio = 4
# these attributes are only required if using decode() and encode()
input_symbol_table = [chr(c) for c in range(256)]
output_symbol_table = [
s for s in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
]
padding_symbol = '='
注意:必须子类
Encoder,不能直接使用!
的子类Encoder具有以下可用的公共方法:
从一个碱基编码到另一个碱基
encode()将类的输入符号表中的可迭代符号编码为类的输出符号表中的可迭代符号,观察选择的编码比率和填充符号。
encoder = CustomEncoder()
encoder.encode(['c', 'a', 'b', 'b', 'a', 'g', 'e', 's'])
# -> ['Y', '2', 'F', 'i', 'Y', 'm', 'F', 'n', 'Z', 'X', 'M', '=']
编码原始
encode_raw()像 一样工作encode(),只是不解释符号。相反,应使用 0->(base - 1) 范围内的纯整数。基数的值用作填充符号。
encoder = CustomEncoder()
encoder.encode_raw([1, 2, 3, 4, 5, 6, 7])
# -> [0, 16, 8, 3, 1, 0, 20, 6, 1, 48, 64, 64]
从一个基地解码到另一个基地
decode()的工作方式与 完全相同encode(),但相反。
encoder = CustomEncoder()
encoder.decode(['Y', '2', 'F', 'i', 'Y', 'm', 'F', 'n', 'Z', 'X', 'M', '='])
# -> ['c', 'a', 'b', 'b', 'a', 'g', 'e', 's']
解码原始
decode_raw()像 一样工作decode(),只是不解释符号。相反,应使用 0->(base - 1) 范围内的纯整数。基数的值用作填充符号。
encoder = CustomEncoder()
encoder.decode_raw([0, 16, 8, 3, 1, 0, 20, 6, 1, 48, 64, 64])
# -> [1, 2, 3, 4, 5, 6, 7]
功能接口
从一个碱基编码到另一个碱基(使用的编码比率是已知的)
对于给定的输入基数、输入符号表、输出基数、输出符号表、输出填充、输入比率、输出比率和输入数据(作为由输入符号表中定义的项组成的迭代):返回输入数据,使用指定的编码比率和符号表(如果需要,使用提供的输出填充符号)编码到指定的基数。将输出数据作为保证在输出符号表或输出填充符号中的项目列表返回。
import basest
basest.core.encode(
input_base=256,
input_symbol_table=[chr(c) for c in range(256)],
output_base=64,
output_symbol_table=[
s for s in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
],
output_padding='=', input_ratio=3, output_ratio=4,
input_data='falafel'
)
# -> ['Z', 'm', 'F', 's', 'Y', 'W', 'Z', 'l', 'b', 'A', '=', '=']
编码原始
与上面的函数类似,basest.core.encode_raw将一个基编码为另一个,但只接受并返回整数数组(例如,字节将作为 0-255 之间的整数传递,而不是作为byte对象传递)。因此,它省略了填充和符号表参数,但在功能和形式上与encode.
import basest
basest.core.encode_raw(
input_base=256, output_base=85,
input_ratio=4, output_ratio=5,
input_data=[99, 97, 98, 98, 97, 103, 101, 115]
)
# -> [31, 79, 81, 71, 52, 31, 25, 82, 13, 76]
从一个编码的基础解码到另一个。
对于给定的输入基数、输入符号表、输入填充、输出基数、输出符号表、输入比率、输出比率和输入数据(作为由输入符号表中定义的项组成的迭代),返回输入数据,从它被编码到的基础上解码。将输出数据作为保证在输出符号表中的项目列表返回,没有填充。
这本质上是相反的
encode()
import basest
basest.core.decode(
input_base=64,
input_symbol_table=[
s for s in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
],
input_padding='=',
output_base=256, output_symbol_table=[chr(c) for c in range(256)],
input_ratio=4, output_ratio=3,
input_data='YWJhY3VzIFpaWg=='
)
# -> ['a', 'b', 'a', 'c', 'u', 's', ' ', 'Z', 'Z', 'Z']
解码原始
与上面的函数类似,basest.core.decode_raw将从一个基数解码到另一个基数,但只接受并返回整数数组(例如,base64 将作为 0-65 之间的整数传递(65 用于填充符号),而不是作为str对象)。因此,它省略了填充和符号表参数,但在功能和形式上与decode.
import basest
basest.core.decode_raw(
input_base=85, output_base=256,
input_ratio=5, output_ratio=4,
input_data=[31, 79, 81, 71, 52, 31, 25, 82, 13, 76]
)
# -> [99, 97, 98, 98, 97, 103, 101, 115]
在给定范围内找到从一个碱基到任何碱基的最佳编码率
对于给定的输入基数(例如 base-256 / 8 位字节),给定的期望输出基数(例如基数 94)或给定范围的可接受输出基数和要考虑用于输入的块大小范围(数量一次处理的字节/符号),返回最有效的输出基数和要使用的编码比率(就输入基数到输出基数而言)。
返回包含一个整数作为第一项(表示最有效的输出基)和一个元组作为第二项的元组,其中包含两个整数,表示输入基符号与输出基符号的比率。
import basest
basest.core.best_ratio(input_base=256, output_bases=[94], chunk_sizes=range(1, 256))
# -> (94, (68, 83))
basest.core.best_ratio(input_base=256, output_bases=[94], chunk_sizes=range(1, 512))
# -> (94, (458, 559))
basest.core.best_ratio(input_base=256, output_bases=range(2, 95), chunk_sizes=range(1, 256))
# -> (94, (68, 83))
basest.core.best_ratio(input_base=256, output_bases=range(2, 334), chunk_sizes=range(1, 256))
# -> (333, (243, 232))
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。