Base 系列编码是一种将数据转换为不同基数的编码方式。它们是常见的编码方式,常用于将数据表示为可打印字符序列或进行数据传输。
1.Base16
也被称为十六进制(Hexadecimal),是一种常见的数值表示方式,使用 16 个字符来表示数字 0 到 15。这些字符通常是 0-9 和 A-F(或 a-f),分别表示数字 0 到 9 和十六进制的 A 到 F(或 a 到 f)。
编码的原理如下:
将待编码的数据分割成每 4 个位一组(通常是一个字节)。
将每组 4 个位转换为对应的十六进制字符。每个位的取值范围是 0 到 15,分别用 0-9 和 A-F(或 a-f)表示。
eg . 一个二进制数据:01001101 01100001 01101110(对应 ASCII 码为 "Man")。
将数据分组为 每 4 个位一组:0100 1101 0110 0001 0110 1110。
将每组 4 个位转换为对应的十六进制字符:4D 61 6E。
2.Base32
用于将二进制数据转换为可打印字符序列。与 Base64 不同,Base32 使用 32 个不同的字符来表示数据,因此编码后的结果比 Base64 更长,但它可以更好地适应某些场景的需求,例如在文件名中使用。
编码的原理如下:
1.将待编码的数据分割成每 5 个字节一组(40 位)。
2.将每组 40 位的数据划分为 8 个 5 位的片段。
3.将每个 5 位的片段转换为对应的 Base32 字符。Base32 字符集包含 32 个字符,通常是 A-Z 和 2-7,用于表示不同的值。
4.如果最后一组数据不足 5 个字节,会进行特殊处理来填充数据,确保数据长度为 5 的倍数。通常使用 "=" 字符进行填充。
eg.
01001101 01100001 01101110 00110001 00110010(对应 ASCII 码为 "Man12")。
1.将数据分组为每 5 个字节一组:01001101 01100001 01101110 00110001 00110010。
2.将每组 40 位的数据划分为 8 个 5 位的片段:01001 10110 00010 11000 01100 01010。
3.将每个 5 位的片段转换为对应的 Base32 字符:JW2CIKA。
4.最后加上填充字符 "=",如果需要的话,得到最终的 Base32 编码结果为 "JW2CIKA="。
3.Base58
Base58 编码通常用于比特币和其他加密货币的地址表示,以及其他需要短字符长度和可读性的应用。
编码的原理如下:
1'定义一个包含 58 个字符的字符集,通常是由除去容易混淆的字符(如 0、O、I、l)和不包含大小写敏感的字母(如 A、a、B、b)组成的集合。
2.将待编码的数据转换为一个大整数。
3.使用大整数除以 58,将结果的余数映射为对应的 Base58 字符,并将该字符添加到结果中。
4.将大整数除以 58 的结果作为新的被除数,重复步骤 3,直到被除数为 0。
5.得到最终的 Base58 编码结果。
eg.
二进制数据:01001101 01100001 01101110 00110001 00110010(对应 ASCII 码为 "Man12")。
1.将数据转换为一个大整数:3113893779。
2.将大整数除以 58,得到商和余数:商为 53620788,余数为 55。
3.将余数映射为对应的 Base58 字符,添加到结果中:结果为 "z"。
4.将商作为新的被除数,重复步骤 2 和 3,直到商为 0。
5.得到最终的 Base58 编码结果为 "z".
4.Base64
Base64 是一种常用的编码方式,用于将二进制数据转换为可打印字符序列。它广泛应用于电子邮件、网页传输、数据存储等场景,常用于将图片、音频、视频等二进制数据以文本形式进行传输或存储。
编码的原理如下:
1.将待编码的数据分割成每 3 个字节一组(24 位)。
2.将每组 24 位的数据划分为 4 个 6 位的片段。
3.将每个 6 位的片段转换为对应的 Base64 字符。Base64 字符集包含 64 个字符,通常是 A-Z、a-z、0-9 和 "+"、"/"(有时还会使用 "=" 作为填充字符),用于表示不同的值。
4.如果最后一组数据不足 3 个字节,会进行特殊处理来填充数据,确保数据长度为 3 的倍数。通常使用 "=" 字符进行填充。
还是上一个例子
1.将数据分组为每 3 个字节一组:01001101 01100001 01101110 00110001 00110010。
2.将每组 24 位的数据划分为 4 个 6 位的片段:010011 010110 000101 101110 001100 010000。
3.将每个 6 位的片段转换为对应的 Base64 字符:S2FtMQ==。
4.最后加上填充字符 "=",如果需要的话,得到最终的 Base64 编码结果为 "S2FtMQ=="
5.Base85
将二进制数据转换为可打印字符序列。与 Base64 相比,Base85 可以更高效地表示二进制数据,因为它使用更大的字符集,每个字符可以表示更多的比特。
编码的原理如下:
1.定义一个包含 85 个字符的字符集,通常是由连续的 ASCII 可打印字符组成,不包含易混淆的字符。
2.将待编码的数据分割成每 4 个字节一组(32 位)。
3.将每组 32 位的数据转换为一个大整数。
4.使用大整数除以 85^4,将结果的商和余数映射为对应的 Base85 字符,并将该字符添加到结果中。
5.将大整数除以 85^3 的结果作为新的被除数,重复步骤 4,直到被除数为 0。
6.得到最终的 Base85 编码结果。
Base85 编码通常用于数据压缩和加密算法中,以及需要高效表示二进制数据的应用。它比 Base64 更节省空间,但也会增加编码和解码的计算复杂性。
由于 Base85 使用更大的字符集,编码后的数据长度会比原始数据更长。具体的长度增加比例取决于原始数据的大小。
6.Base91
一种自定义的编码方案,用于将二进制数据转换为可打印字符序列。
Base91 编码的原理如下:
1.定义一个包含 91 个字符的字符集,通常是由连续的 ASCII 可打印字符组成,不包含易混淆的字符。
2.将待编码的数据分割成每 13 个字节一组(104 位)。
3.将每组 104 位的数据转换为一个大整数。
4.使用大整数除以 91^8,将结果的商和余数映射为对应的 Base91 字符,并将该字符添加到结果中。
5.将大整数除以 91^7 的结果作为新的被除数,重复步骤 4,直到被除数为 0。
6.得到最终的 Base91 编码结果。
Base91 编码可以更高效地表示二进制数据,相较于 Base64 和 Base85,它可以在相同长度的编码结果中包含更多的原始数据。这使得 Base91 在某些情况下可以提供更好的压缩比率。
由于 Base91 使用自定义的字符集,它并不是一种标准的编码方式,而是一种特定应用或系统中使用的自定义方案。在实际应用中,如果要使用 Base91 编码,需要确保编码和解码的双方都使用相同的字符集和编码规则。