Base16、Base32、Base64 等其他的 BaseX 编码并不是一种加密方式,它们只是一种编码手段,我们可以借助一些在线的编解码工具还原成明文,因此这类编码方式不适合用于数据加密,但是我们可以使用这种编码很方便的进行数据传输与存储,因此这类编码的使用十分广泛。

一、Base16

1.1、编码规则:

Base16编码使用16ASCII可打印字符(数字0-9和字母A-F)对任意字节数据进行编码。

  • 获取输入字符串每个字节的二进制值(输入的非ASCII字符,使用UTF-8字符集);

  • 将获得的二进制值串联进来;

  • 按照4比特为一组进行切分(8比特数据按照4比特切分刚好是两组,因此Base16无填充符号=);

  • 将每组二进制数分别转换成十进制;

  • 按照Base16对应的编码表将对应的编码串接起来就是Base16编码;

1.2、编码特征

Base16编码后的数据量是原数据的两倍,1000比特数据需要250个字符(即 250*8=2000 比特)。换句话说:Base16使用两个ASCII字符去编码原数据中的一个字节数据。

Base16编码是一个标准的十六进制字符串(注意是字符串而不是数值),更易被人类和计算机使用,因为它并不包含任何控制字符,以及Base32Base64中的=符号。

1.3、编码表

编码编码
0088
1199
2210A
3311B
4412C
5513D
6614E
7715F

1.4、编码示例

  • 待编码字符串:123
  • 编码后字符串:313233
原始字符(ASCII可显示字符)对应二进制(对应两个)对应编码后字符串
10011 000131
20011 001032
30011 001133

二、Base32

2.1、编码规则

Base32编码是使用32ASCII可打印字符(字母A-Z和数字2-7)对任意字节数据进行编码。

  • 获取输入字符串每个字节的二进制值(输入的非ASCII字符,使用UTF-8字符集);

  • 将获得的二进制值串联进来;

  • 按照5比特为一组进行切分;

  • 将每组二进制数分别转换成十进制;

  • 按照Base32对应的编码表将对应的编码串接起来就是Base32编码;

2.2、编码特征

  • 数据的二进制传输是按照8比特一组进行(即一个字节);
  • Base325比特切分的二进制数据必须是40比特的倍数(5和8的最小公倍数),最小为40个比特
  • 编码后的字符串不用区分大小写并排除了容易混淆的字符,可以方便地由人类使用并由计算机处理;

与Base64相比,Base32具有许多优点:

  • 适合不区分大小写的文件系统,更利于人类口语交流或记忆;
  • 结果可以用作文件名,因为它不包含路径分隔符 “/”等符号;
  • 排除了视觉上容易混淆的字符,因此可以准确的人工录入(例如,RFC4648符号集忽略了数字“1”、“8”和“0”,因为它们可能与字母“I”,“B”和“O”混淆);
  • 排除填充符号“=”的结果可以包含在URL中,而不编码任何字符;

与Base16相比,Base32的优势:

  • Base32比Base16占用的空间更小(1000比特数据Base32需要200个字符,而Base16则为250个字符);

Base32的缺点:

  • Base32比Base64多占用大约20%的空间,因为Base32使用8个ASCII字符去编码原数据中的5个字节数据,而Base64是使用4个ASCII字符去编码原数据中的3个字节数据;

2.3、编码表

编码编码编码编码
0A8I16Q24Y
1B9J17R25Z
2C10K18S262
3D11L19T273
4E12M20U284
5F13N21V295
6G14O22W306
7H15P23X317
填充=

2.4、编码示例

  • 待编码字符串:123
  • 编码后字符串:GEZDG===
原始字符(ASCII可显示字符)对应二进制(对应两个)
10011 0001
20011 0010
30011 0011
  • 拼接后的二进制:00110001 00110010 00110011
  • 按照5比特进行拆分:00110 00100 11001 00011 0011
  • 最后一组的位数不足5,末位填充0后:00110 00100 11001 00011 00110
  • 对应字符串位:GEZDG
  • 由于最少为40个比特,计算40/5=8,因此需要补3=,最终为GEZDG===

三、Base64

3.1、编码规则

Base64编码是使用64ASCII可打印字符(A-Za-z0-9+/)对任意字节数据进行编码。

  • 获取输入字符串每个字节的二进制值(若不足8比特则高位补0);

  • 将获得的二进制值串联进来;

  • 按照6特为一组进行切分;

  • 将每组二进制数分别转换成十进制;

  • 按照Base64对应的编码表将对应的编码串接起来就是Base64编码;

由于二进制数据是按照8比特一组进行传输,因此Base64按照6比特一组切分的二进制数据必须是24比特的倍数(6和8的最小公倍数),24比特就是3个字节,若原字节序列数据长度不是3的倍数时:

  • 原字节序列剩下1个输入数据,则在编码结果后加1个=

  • 原字节序列剩下2个输入数据,则在编码结果后加2个=

3.2、编码特征

完整的Base64定义可见RFC1421RFC2045。因为Base64算法是将3个字节原数据编码为4个字节新数据,所以Base64编码后的数据比原始数据略长,为原来的4/3。在电子邮件中,根据RFC822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%

Base64可用于任意数据的底层二进制数据编码,以应用于只能传输ASCII字符的场合。不过最常用于文本数据的处理传输,例如在MIME格式的电子邮件中,Base64可以用来编码邮件内容,方便在不同语言计算机间传输而不乱码,注意是传输而不是显示,例如在西欧地区计算机上使用UTF-8编码即可正常显示中文(安装有对应字库),但是它未必能正常传输中文,这时转换为Base64便无此顾虑。

Base64编码若无特别说明,通常约定非ASCII字符按照UTF-8字符集进行编码处理。

3.3、编码表

编码编码编码编码
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

3.4、编码示例

  • 待编码字符串:1234
  • 编码后字符串:MTIzNA==
原始字符(ASCII可显示字符)对应二进制(对应两个)
100110001
200110010
300110011
400110100
  • 拼接后的二进制:00110001 00110010 00110011 00110100
  • 按照6比特进行拆分:001100 010011 001000 110011 001101 00
  • 最后一组的位数不足5,末位填充0后:001100 010011 001000 110011 001101 000000
  • 对应编码表的字符串:MTIzNA
  • 原字节序列的长度为4,不为3的倍数,还差2个输入数据,所以需要补上2个=,最终为:MTIzNA==

四、Base58

4.1、编码规则

Base58编码使用58ASCII可打印字符(不使用数字0,大写字母O、大写字母I、小写字母l,以及+/)对 数字 进行编码。

  • 通过对数字不断取余58,依据获取的余数对照编码表得到对应的编码值;
  • 通过不断的对数字进行取整操作,得到新的数字进入下一个循环;
  • 当新的数字为0时,结束编码;
  • 通过对循环中每次得到的编码按照得到的先后顺序逆序排序(即第一次得到的编码在最终编码值的末尾),得到最终的编码值;

4.2、编码特征

  • 在某些字体下,数字0字母大写O,以及字母大写I字母小写l会非常相似,为避免混淆,不使用这些字符;
  • 不使用+/的原因是非字母或数字的字符串作为帐号较难被接受;
  • 没有标点符号,通常不会被从中间分行;
  • 大部分的软件支持双击选择整个字符串;
  • 编码后的数据为原始的数据长度的1.37倍,稍稍多于Base64的1.33倍;
  • 用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址;

4.3、编码表

编码编码编码编码
0115G30X45n
1216H31Y46o
2317J32Z47p
3418K33a48q
4519L34b49r
5620M35c50s
6721N36d51t
7822P37e52u
8923Q38f53v
9A24R39g54w
10B25S40h55x
11C26T41i56y
12D27U42j57z
13E28V43k
14F29W44m

4.4、编码示例

  • 待编码数字:123
  • 编码后字符串:38

解析过程如下所示:

  • 对数字进行取余58的操作,获取余数:123%58=7,得到第一个编码为8
  • 对数字进行取整操作,新的数字为取整之后的值:123/58=2
  • 对新数字进行取余58的操作,获取余数:2%58=2,得到第二个编码为3
  • 依次循环最终新数字为0时结束;
  • 最后得到的编码为38

五、Base62

5.1、编码规则

Base62编码使用62ASCII可打印字符(数字0~9,字母A~Za~z)进行编码。

  • 通过对数字不断取余62,依据获取的余数对照编码表得到对应的编码值;
  • 通过不断的对数字进行取整操作,得到新的数字进入下一个循环;
  • 当新的数字为0时,结束编码;
  • 通过对循环中每次得到的编码按照得到的先后顺序逆序排序(即第一次得到的编码在最终编码值的末尾),得到最终的编码值;

5.2、编码特征

  • Base62Base64相比唯一的区别就是少了两个特殊符号;
  • Base62是一个改掉了Base64所有缺点的算法;
  • 唯一的不足是因为码空间小了,会多占用1/32空间;
  • 常被用来做短url的映射;

5.3、编码表

编码编码编码编码
0016G32W48m
1117H33X49n
2218I34Y50o
3319J35Z51p
4420K36a52q
5521L37b53r
6622M38c54s
7723N39d55t
8824O40e56u
9925P41f57v
10A26Q42g58w
11B27R43h59x
12C28S44i60y
13D29T45j61z
14E30U46k
15F31V47l

5.4、编码示例

  • 待编码数字:123
  • 编码后字符串:1z

解析过程如下所示:

  • 对数字进行取余62的操作,获取余数:123%62=61,得到第一个编码为z
  • 对数字进行取整操作,新的数字为取整之后的值:123/62=1
  • 对新数字进行取余62的操作,获取余数:1%62=1,得到第二个编码为1
  • 依次循环最终新数字为0时结束;
  • 最后得到的编码为1z

六、Base85

Base85又叫ASCII85,是Paul E. Rutterbtoa程序开发的一种二进制文本编码方式。

6.1、编码规则

Base85编码使用85ASCII可打印字符(数字0~9,字母A~Za~u,和一些其他字符)进行编码。

  • 4个ASCII字符一组(如果最后的不够4个ASCII字符,右面填充二进制全0),从左到右拼接这4个ASCII对应的二进制的值,将该二进制转为十进制
  • 将得到的十进制数字对58取余操作,得到第一个关键数字;
  • 将得到的十进制数字对58取整操作,得到新的十进制数字;
  • 使用新的十进制数字再次对58进行取余操作,依次得到新的关键数字,直到取整的结果为0
  • 将最终得到的关键数字排序后(按照得到数字的先后,从右向左排序);
  • 参考Base85的编码表得到编码后的字符序列,细心点会发现,得到的关键数字加上33的话,也是对应的ASCII的值;
  • 编码后的数据中包含像反斜杠引用等转义字符也是Base85的缺点之一,因为这些字符在一些编程语言或基于文本的协议中有特殊的含义;

6.2、编码特征

  • 利用5个ASCII字符来表示4字节的数据,如果每个ASCII字符占用8比特,则编码后的数据比原始数据大长度增加1/4
  • UUENCODEBase64编码方式更加高效;
  • Base85Adobe’s PostScriptPortable Document Format(PDF)的主要编码模块;
  • 4字节可以表示2^32=4294967296个可能的值,而85^5=4437053125个可能的值,这就可以代表所有32bit的值,85^4可以表示4182119424个数值,所以85的5次方是基于5个ASCII字符表示4byte的最好且最小选择;

6.3、编码表

编码编码编码编码
0!22744M66c
123845N67d
2#24946O68e
3$25:47P69f
4%26;48Q70g
5&27<49R71h
628=50S72i
7(29>51T73j
8)30?52U74k
9*31@53V75l
10+32A54W76m
11,33B55X77n
12-34C56Y78o
13.35D57Z79p
14/36E58[80q
15037F59\81r
16138G60]82s
17239H61^83t
18340I62_84u
19441J63`
20542K64a
21643L65b

6.4、编码示例

  • 待编码字符串:sure
  • 编码后字符串:F*2M7

解析过程如下所示:

  • 字符串sure的每位字符对应的ASCII的十进制分别为:115117114101
  • 将十进制转换为二进制,得到的二进制序列为:01110011 01110101 01110010 01100101
  • 该二进制拼接起来后对应的十进制数字为:1937076837
  • 对该十进制数字进行循环的取余/整操作,按照先后顺序依次得到的余数分别为:224417937
  • 参考Base85的编码表,对应的编码值分别为:7M2*F
  • 按照得到的余数的先后顺序逆序排列后得到最终的编码值为:F*2M7

七、Base91

Joachim Henke在2005年发明,官方的介绍页面为:basE91 encoding

7.1、编码规则

加密使用类似于Base64的方法,但将字母扩展为91个字符:94个可打印的ASCII字符(从0x210x7E),省略了-\';为了简化,将数据分为13位二进制数据包(即2^13=8192个值),然后将其编码为2个字母(包含91个字符,其中91^2=8281);

  • 将输入的数据看作二进制信息流;
  • 每次从信息流中读取13位的比特数据,将这组合成的13位比特转换为10进制的整数;
  • 如果该整数小于或等于88,则额外再读取一位,并将这一位放在整数的第14位(最低位为1)(原因:由于91^2=8281,最大可表示为8280,而2^13=8192,因此即使二进制13位全部为1,也可能);
  • 将得到的整数拆分为两个编码值,第一个编码值为整数%91,第二个编码值为整数/91,依据Base91的编码表得到对应的编码后的数据;
  • 依次循环编码接下来的二进制信息流;

7.2、编码特征

  • 该算法相对于Base64来说比较复杂,但更节省空间;
  • Base64不同,输出的大小有点依赖于输入字节,长度为0x00n序列短于长度为0xFFn序列(其中n是足够大的数字);

7.3、编码表

编码编码编码编码
0A23X46u69*
1B24Y47v70+
2C25Z48w71,
3D26a49x72.
4E27b50y73/
5F28c51z74:
6G29d52075;
7H30e53176<
8I31f54277=
9J32g55378>
10K33h56479?
11L34i57580@
12M35j58681[
13N36k59782]
14O37l60883^
15P38m61984_
16Q39n62!85`
17R40o63#86{
18S41p64$87|
19T42q65%88}
20U43r66&89~
21V44s67(90
22W45t68)

7.4、编码示例

  • 待编码字符串:abc
  • 编码后字符串:#G(I

解析过程如下所示:

  • 字符串abc的每位字符对应的ASCII十进制分别为:979899
  • 十进制转换为二进制,得到的二进制序列为:01100001 01100010 01100011
  • 读取该二进制信息流之后,得到的第一个二进制串为:00010 01100001,该二进制串的后半部分为字符a二进制编码,前半部分为字符b的部分二进制编码;
  • 拼接后的二进制串对应的十进制整数为:609,因此首先得到的两个编码值为:609%91=63609/91=6,对应的编码为:#G
  • 继续处理剩余的二进制序列为:00 01100011 011,对应得到的十进制整数为:795,因此得到的两个编码值为:795%91=67795/91=8,对应的编码为:(I
  • 因此最终得到的最终编码为:#G(I

八、Base X(2~36)

BaseX(2~36),其中X可以为2~36的所有编码规则完全一致,这里以Base36为例作一下详细介绍。

8.1、编码规则

Base36编码使用36ASCII可打印字符(数字0-9和字母A-Z)对数字进行编码。

  • 通过对数字不断取余36,依据获取的余数对照编码表得到对应的编码值;
  • 通过不断的对数字进行取整操作,得到新的数字进入下一个循环;
  • 当新的数字为0时,结束编码;
  • 通过对循环中每次得到的编码按照得到的先后顺序逆序排序(即第一次得到的编码在最终编码值的末尾),得到最终的编码值;

8.2、编码特征

  • Base 36的编码规则不同于Base 16/32/64,它无法按照比特范围进行编码操作,需要按照取余/整的不断操作,经过与编码表的对应获得最终的编码值;
  • 对于字符串的相关编码操作,需要将String的字符串转换为基数为2~36的无符号长整型,再进行编码操作;
  • 有符号的32位整数最大值Base36编码为:ZIK0ZJ
  • 有符号的64位整数最大值Base36编码为:1Y2P0IJ32E8E7

8.3、编码表

编码编码编码
0012C24O
1113D25P
2214E26Q
3315F27R
4416G28S
5517H29T
6618I30U
7719J31V
8820K32W
9921L33X
10A22M34Y
11B23N35Z

8.4、编码示例

  • 待编码数字:123
  • 编码后字符串:3F

解析过程如下所示:

  • 对数字进行取余36的操作,获取余数:123%36=15,得到第一个编码为F
  • 对数字进行取整操作,新的数字为取整之后的值:123/36=3
  • 对新数字进行取余36的操作,获取余数:3%36=3,得到第二个编码为3
  • 依次循环最终新数字为0时结束;
  • 最后得到的编码为3F

九、ASCII字符表

9.1、ASCII可显示字符

二进制十进制十六进制字符二进制十进制十六进制字符二进制十进制十六进制字符
00100000320x20空格01000000640x40@01100000960x60`
00100001330x21!01000001650x41A01100001970x61a
00100010340x2201000010660x42B01100010980x62b
00100011350x23#01000011670x43C01100011990x63c
00100100360x24$01000100680x44D011001001000x64d
00100101370x25%01000101690x45E011001011010x65e
00100110380x26&01000110700x46F011001101020x66f
00100111390x2701000111710x47G011001111030x67g
00101000400x28(01001000720x48H011010001040x68h
00101001410x29)01001001730x49I011010011050x69i
00101010420x2A*01001010740x4AJ011010101060x6Aj
00101011430x2B+01001011750x4BK011010111070x6Bk
00101100440x2C,01001100760x4CL011011001080x6Cl
00101101450x2D-01001101770x4DM011011011090x6Dm
00101110460x2E.01001110780x4EN011011101100x6En
00101111470x2F/01001111790x4FO011011111110x6Fo
00110000480x30001010000800x50P011100001120x70p
00110001490x31101010001810x51Q011100011130x71q
00110010500x32201010010820x52R011100101140x72r
00110011510x33301010011830x53S011100111150x73s
00110100520x34401010100840x54T011101001160x74t
00110101530x35501010101850x55U011101011170x75u
00110110540x36601010110860x56V011101101180x76v
00110111550x37701010111870x57W0111011111977w
00111000560x38801011000880x58X011110001200x78x
00111001570x39901011001890x59Y011110011210x79y
00111010580x3A:01011010900x5AZ011110101220x7Az
00111011590x3B;01011011910x5B[011110111230x7B{
00111100600x3C<01011100920x5C\011111001240x7C|
00111101610x3D=01011101930x5D]011111011250x7D}
00111110620x3E>01011110940x5E^011111101260x7E~
00111111630x3F?01011111950x5F_

9.2、ASCII控制字符

二进制十进制十六进制缩写名称/意义
0000 000000x0NUL空字符(Null)
0000 000110x1SOH标题开始
0000 001020x2STX本文开始
0000 001130x3ETX本文结束
0000 010040x4EOT传输结束
0000 010150x5ENQ请求
0000 011060x6ACK确认回应
0000 011170x7BEL响铃
0000 100080x8BS退格
0000 100190x9HT水平定位符号
0000 1010100x0ALF换行键
0000 1011110x0BVT垂直定位符号
0000 1100120x0CFF换页键
0000 1101130x0DCR归位键
0000 1110140x0ESO取消变换(Shift out)
0000 1111150x0FSI启用变换(Shift in)
0001 0000160x10DLE跳出数据通讯
0001 0001170x11DC1设备控制一(XON 启用软件速度控制)
0001 0010180x12DC2设备控制二
0001 0011190x13DC3设备控制三(XOFF 停用软件速度控制)
0001 0100200x14DC4设备控制四
0001 0101210x15NAK确认失败回应
0001 0110220x16SYN同步用暂停
0001 0111230x17ETB区块传输结束
0001 1000240x18CAN取消
0001 1001250x19EM连接介质中断
0001 1010260x1ASUB替换
0001 1011270x1BESC跳出
0001 1100280x1CFS文件分割符
0001 1101290x1DGS组群分隔符
0001 1110300x1ERS记录分隔符
0001 1111310x1FUS单元分隔符
0111 11111270x7FDEL删除

十、在线编码网站