ASCII码 和 Base64编码

3,570 阅读3分钟

ASCII编码

简介

ASCII码(American Standard Code for Information Interchange, 美国信息互换标准代码) 是基于拉丁字母的一套电脑编码系统, 是现今最通用的单字节编码系统.

ASCII码可以用来表示大小写英文字母以及部分字符和控制符, 但是中文俄语法语字符均不能表示, 所以后续出现了可以表示全球字符的utf-8用来解决此问题.

对应关系

我们知道在java中, 一个char可以认为是一个int值, 举例:

'A' == 65
这里的对应关系就是基于ASCII编码, 其中A-Z, a-z, 0-9的对应关系如下:

十进制 对应字符 十进制 对应字符 十进制 对应字符
65 A 97 a 48 0
66 B 98 b 49 1
67 C 99 c 50 2
68 D 100 d 51 3
69 E 101 e 52 4
70 F 102 f 53 5
71 G 103 g 54 6
72 H 104 h 55 7
73 I 105 i 56 8
74 J 106 j 57 9
75 K 107 k
76 L 108 l
77 M 109 m
78 N 110 n
79 O 111 o
80 P 112 p
81 Q 113 q
82 R 114 r
83 S 115 s
84 T 116 t
85 U 117 u
86 V 118 v
87 W 119 w
88 X 120 x
89 Y 121 y
90 Z 122 z

Base64编码

意义

现有的字符集非常多, 常用的有 UTF-8 / GBK 等, 这里面的某些字节在某些传输渠道中不支持, 比如邮件传输就不支持上面ASCII码中的控制字符, Base64的创建就是为了解决此问题.

对应关系

Base64内的64是指64个字符, 分别是 A-Z, a-z, 0-9, +, / 它们与十进制的对应关系如下:

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

如何对ASCII码进行Base64编解码

Base64有64个字符, 2^6 = 64, 所以每个Base64编码字符可以用一个6位的二进制来表示. 这样的话如果有3个字节的二进制, 可以用4位Base64字符表示.

编码流程如下:

  1. ASCII码字符串根据ASCII码对照表转换为二进制数值;
  2. 把二进制数值按每6位进行划分;
  3. 然后6位二进制转化为十进制根据对照表找到Base64编码字符.

举例

3位ASCII转4位Bsae64

那如果待编码字符串的长度不是3的倍数呢? 这样的话就ASCII转化的二进制数串不能整除于6了, 也就不能编码为Base64. 这样的情况为了可以整除6编译出完整的字节数, 就需要用0补位. 如果有连续6位都是0的话, 就用=来表示.

举例

补位后编码

相信看完这两个例子, 我们就对Base64的编码过程有一个比较清晰的认识了.