0. 前言
之所以取这个题目,是因为在面试的过程中,许多求职者对问题“请列举常用的加密算法”给出了比较普遍的回答:“用过 MD5
和 Base64
”,更有甚者说,“ Base64
是对称加密, MD5
是非对称加密”。那么,通过接下来的三篇文章科普下,在编程过程中常见的三个术语:字节编码 、数据摘要、 报文加密。
1. 编码介绍
在计算机领域,数据存储单位叫字节——byte,最小的存储单元的容量是1位-1bit。一个bit有两个状态 0 和 1。1byte = 8bit。通常,一个英文字母占1字节,汉字采用GBK编码时,占用2字节。UTF-8是可变长度编码,一般用 0-4 字节表示。
以上介绍,仅局限于计算机可以显示在屏幕上的字符。但是 1byte 通常可表示 256 个不同的数据。二进制表示:00000000-11111111,即 2^8 。根据 ASCII 中显示,可见字符不足 100 个。若想完整的显示 1byte 表示的全部内容,需要对其进行编码。通常使用16进制的方式,0x00-0xFF。0x31 表示字符 ‘1’ ,0x01 表示字母 1,0x41 表示 ‘A’ ,0x61 表示 ‘a’ 。不再一一列举,有兴趣的小伙伴可以查阅 ASCII 码表。
2. 十六进制编码
2.1 概念
16进制编码,是基于2进制转换的过程。下表列举些常见的数值编码及其意义。
十进制 | 2进制 | 16进制 | 意义 |
---|---|---|---|
0 | 00000000 | 0x00 | null |
1 | 00000001 | 0x01 | 1 |
49 | 00110001 | 0x31 | ‘1’ |
65 | 01000001 | 0x41 | ‘A’ |
97 | 01100001 | 0x61 | ‘a’ |
此处,需要引入一个概念——基数。2 进制基数:0、1。10进制基数:0-9。16进制基数0-9,A-F。通过观察表示一串内容的基数,可以快速判断它使用的编码方式哦!
下表表示16进制基数与10进制、2进制的关系。均用 1byte 表示。
16进制 | 10进制 | 2进制 |
---|---|---|
0x00 | 0 | 00000000 |
0x01 | 1 | 00000001 |
0x02 | 2 | 00000010 |
0x03 | 3 | 00000011 |
0x04 | 4 | 00000100 |
0x05 | 5 | 00000101 |
0x06 | 6 | 00000110 |
0x07 | 7 | 00000111 |
0x08 | 8 | 00001000 |
0x09 | 9 | 00001001 |
0x0A | 10 | 00001010 |
0x0B | 11 | 00001011 |
0x0C | 12 | 00001100 |
0x0D | 13 | 00001101 |
0x0E | 14< |