区块链:Base64编码和Base58编码

区块链:Base64编码和Base58编码。

前言

接触base64有很久了,其实一直没有理解base64这种编码的根本原理,或者说是设计意图,今天又读了一遍,终于开窍了,请看下图。

Base64 table

原始值 显示值 原始值 显示值 原始值 显示值 原始值 显示值
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

什么意思呢?我这样理解,在计算机里面,所有信息都是以二进制的方式承载的,即01,这二进制如何去表达我们想要显示(printable)的信息呢?这个时候ASCII码就出现了,以及后来的UniCode等等,它们是以字节为单位来处理,一个字节是8位,这也是计算机系统里面的一个标准处理单位。

而Base64的目的不是这个,它是要把一段信息显示成另外的一个形式,变成不可直接读,这样尤其是在邮件传输时,可以增加一点安全性。所以,它是以6位为一个单位来处理,对应上面的这个码表,来显示的。Base58是Base64的子集,它的码表元素就更少了,少了8个( 0 , O (大写O),I (大写i) ,l (小写L) , + (加号) ,/ (后倒线)),现在被用于区块链领域。

6位的处理会造成有的时候,不够一个字节,后面需要多补一个到两个字节的0来补齐长度,统一用=显示。

以下这个例子取自维基百科,一个表用MD不好展示,分成了两个表:

Source text (ASCII) M a
Source octets 77 (0x4d) 97 (0x61)
Bit pattern 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0
Source text (ASCII) M a
Bit pattern 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0
Index 19 22 4 (padding)
Base64-encoded T W E =
Encoded octets 84 (0x54) 87 (0x57) 69 (0x45) 61 (0x3D)

这样MA就变成了TWE=,这样就清楚了。