2018-05-17 关于Base64的笔记

为什么要有Base64,它解决什么问题?

Base64是一种编码格式,用于将不可读的二进制转换为可读的字符。Base64,这个名字取的很直观,就是基于64个字符的二进制转换。这64个字符是[A-Za-z0-9+/],刚好64个。
我们知道,一个byte是占8 bit,用8bit可以表示出2^8 = 256个值,这里才64个字符,不够表示的啊。别急,这就需要做一次转换了,简而言之,就是把3个byte扩展成4个byte。
3 byte = 24 bit,把24bit分为4个单元,每个单元为6bit,2^6 = 64,64个字符刚好可以用完。

比如"hello world",如果我们要用Base64编码应该怎么表示?
简单起见,拿前3个字符来举例,一个字符占一个byte

  1. "hel"的ASCII编码转换成十进制是104101108, 转换成二进制就是01101000, 01100101, 01101100
  2. 将这24个bit分成4个单元,011010, 000110, 010101, 101100
  3. 每个单元前面补齐两个0,就是00011010, 00000110, 00010101, 00101100,对应十进制就是26, 6, 21, 44
  4. 对应下表的字符,就是aGVs
 0 A  17 R   34 i   51 z
 1 B  18 S   35 j   52 0
 2 C  19 T   36 k   53 1
 3 D  20 U   37 l   54 2
 4 E  21 V   38 m   55 3
 5 F  22 W   39 n   56 4
 6 G  23 X   40 o   57 5
 7 H  24 Y   41 p   58 6
 8 I  25 Z   42 q   59 7
 9 J  26 a   43 r   60 8
 10 K  27 b   44 s   61 9
 11 L  28 c   45 t   62 +
 12 M  29 d   46 u   63 /
 13 N  30 e   47 v
 14 O  31 f   48 w   
 15 P  32 g   49 x
 16 Q  33 h   50 y

如果一串二进制不够3byte整除怎么办? 比如"h"这个字符,变成Base64编码应该是什么?

  1. h的ASCII二进制是01101000
  2. 因为原始字符只有1byte,只能分两个6bit的单元,不要紧,先分。011010, 00 0000 还差2byte
  3. 将每个单元补齐两个0,就是00011010, 00000000,还差2byte
  4. 转换为aA,还差两个字节,用等号(=)代替,就是aA==

刚才我们用String的byte数组说明了Base64编码,这无疑有点多此一举,本身String就是ASCII编码可见的啊。但除了String字符之外,在计算机世界所有的东西都是用二进制表示的,如一个图片,一个流媒体,都是用二进制表示,这些资源就可以通过base64来达到像字符一样的可读效果了,只不过被base64编码的字符串其实也没啥语义上的可读性。

你可能感兴趣的:(2018-05-17 关于Base64的笔记)