Base编码到底是做什么用的?

这么多Base编码,都是用来做什么的?BaseEncoding是一组二进制转换文本的编码模式(EncodingScheme),常见的有Base64、Base58、Base32、Base16。不仅仅是为什么需要二进制转换文本这种编码模式,常见的误解之一是,既然所有的代码最终都变成了0和1,那么就不需要分为ASCII和Base64代码吗?


Base代码的历史。在20世纪70~1980年代,DEC(与其他公司)生产的微型计算机所用的字符编码为ASCII。每一个字节使用7位,提供128个可用值。它足以满足大写和小写拉丁字母、数字、标点、一些常见的数学符号、货币符号和控制字符的需求。从那以后,ASCII变得很受欢迎,并且在很长一段时间内占据了主导地位。ASCII规定了[0,127]之间的字符编码,其中[0,31]和127(del)这3个控制字符(可以用manasciii进行验证)。因特网上的杀手级应用-电子邮件系统最初是为传输7位ASCII文本而设计的,因此,在传输信息时,一些邮件网关会清除[0,31]这些控制字符,而另一些则会替换10(newline或。



(carrige或\r)和13(carrige)字符,有的更粗暴地清空了二进制的最高位置,有的程序在收到[128,255]之间会出现错误。如何在不同的邮件网关之间安全地传输控制字符、国际字符和二进制文件?Base64编码作为MIME(RFC2045和RFC3548)多媒体电子邮件标准的一部分开发。解决Base64编码问题的思路非常简单。由于直接传输控制字符、国际字符和二进制文件容易导致原始信息在传输过程中出现错误,因此将原始信息全部转换为ASCII的可打印字符,从而使旧系统不再随意改变其内容。


Base64是e64?其核心算法是将每3个字节(3*8=24比特)依次转换为4个可打印字符(4*log64=24比特)。以下是具体操作:把3个字节的数据,先后放在24个缓冲区,先来的字节占据高位。如果数据不足3个字节,缓冲器中剩余的比特用0补充。每次取出6个比特,根据其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中文字符作为编码输出,直到所有输入数据转换完成。


如果原始数据长度不是3的倍数,并且剩下1个输入数据,则在编码结果之后增加2个=;如果剩下2个输入数据,则在编码结果之后增加1个=。表示补充字节数。以换行字符(ASCII码10)为例,原二进制如下。十二进制表示为00001010,放置在24位缓冲区补零为00001010000000000000000。每一次取6个比特,如右边的划分所示:0000100000000000000000。由于后两部分为补零,适用于规则3。前两部分的十进制依次为2,32,因此通过索引表选择的值为C,g。后两部分是补零,所以换成=。所以结果是Cg==。


为何需要Base58?第一,Base58和Base64一样,都是一组二进制转文本(binary-to-text)的编码模式。Base58的主要职责是将大整数显示为文本,这是中本聪在Bitcoin中首先引入的。为什麽这样使用?原因如下:I(大写i)和l(小写l),以及+和/(non-alphanumeric的非字母和数字),共有6个字符。因为64-6=58,所以Base58的名字也是由来的。非字母和数字字符不容易混入账户地址。邮件中没有标点就不会断开(意味着排除断开的可能性)双击选择所有字符和数字串。与Base58相比,Base56少了1(1)和o(小写o)两个字符,而Base32只包含A-Z和2-7这32个字母和数字。


Base58的特点根据维基百科,Base58不太适合编码二进制数据,而是适合编码大整数?首先,我们先来看一下Base58的一些常见的Base编码,然后再讨论它们的实现原理。Base16有些人可能会说Base16我没用过,怎么能说普通呢?第一眼看上去,这个名字还是很吓人的,但实际上它是Hexidecimal十六进制编码。对101010来说,将被编码为0xAA。从分解上看,1010是十进制的10,相当于十六进制的A。这是因为十六进制只能表示0-9和A-F这16个数字,16换成二进制的范围是0000-1111。


Base32这个代码呢?同样,它所能表达的二进制范围是0000-11111,也就是2的5次方,也就是32个数字。但问题是二进制从8位开始,8不能排除5。既然8除以5不能排除,那就找8和5的最小公倍数,也就是40。换句话说,5bytes=8chars。也就是说,我们需要把每5个字节转换成8个Base32中的字节。

因此,我们可以总结一些规则。这种编码方式,8和4的最小公倍数是8,所以1bytes=2chars,每一次都可以把一个字节转换成2个字符,正好对齐。而且Base32这种编码方式,由于8和5的最小公倍数是40,所以5bytes=4chars,存在对齐不了的情况,所以非5字节倍数的字节序列需要额外补齐,同样,Base58和Base64也需要补齐。


分享: