浅谈几种常用的编码方式
浅谈几种常用编码方式
最近在做加解密这块的开发,使用频率最高的就是 Nodejs
的 crypto
模块了,中间出现了很多种不同的编码方式。一直对这些编码方式处于熟练拼写的状态,但是到底有什么区别处于一知半解,借此机会正好整理下这之间的关系。
BINARY
这个应该不用介绍了,在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0)。每一个二进制位( bit
)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节( byte
)。
ASCII
因为计算机处理的数据是用二进制表示,例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了 ASCII
编码,统一规定了常用符号用哪些二进制数来表示。
ASCII
码一共规定了128个字符的编码, 字符 ascii 码对照表
。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。
UNICODE
因为计算机只能处理二进制,如果要处理文本,就必须先把文本转换为二进制才能处理。最早的计算机在设计时采用8个比特( bit
)作为一个字节( byte
),所以,一个字节能表示的最大的整数就是255(二进制11111111 = 十进制255),0 – 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。
如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了 GB2312
编码,用来把中文编进去。
类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码, Unicode
应运而生。 Unicode
把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
UTF-8
UTF-8(8-bit Unicode Transformation Format)
是一种针对 Unicode
的可变长度字符编码,又称万国码,由 Ken Thompson
于1992年创建。现在已经标准化为 RFC 3629
。UTF-8用1到6个字节编码 Unicode
字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。
UTF-8
编码规则:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。 UTF-8
转换表表示如下:
`Unicode`符号范围(十六进制) | bit数 | UTF-8编码方式(二进制) | byte数 |
---|---|---|---|
0000 0000-0000 007F | 0~7 | 0xxxxxxx | 1 |
0000 0080-0000 07FF | 8~11 | 110xxxxx 10xxxxxx | 2 |
0000 0800-0000 FFFF | 12~16 | 1110xxxx 10xxxxxx 10xxxxxx | 3 |
0001 0000-0010 FFFF | 17~21 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 4 |
BASE64
所谓 Base64
,就是选出64个字符: 小写字母 a-z
、大写字母 A-Z
、数字0-9、符号”+”、”/”(再加上作为垫字的”=”,实际上是65个字符)作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。
具体来说,转换方式可以分为四步。
- 第一步,将每三个字节作为一组,一共是24个二进制位。
- 第二步,将这24个二进制位分为四组,每个组有6个二进制位。
- 第三步,在每组前面加一组00,扩展成32个二进制位,即四个字节。
-
第四步,根据 下面的
base64
编码索引表,得到扩展后的每个字节的对应符号,这就是Base64
的编码值。
如果只有两个字节
按照上面的规则,将16位划分为三组,最后一组除了前面加一组00,末尾也加一组00,按照索引表得到编码值后,在末尾加上一个 =
.
如果只有一个字节
按照上面的规则,将8位划分为两组,最后一组除了前面加00,末尾加两组00,按照索引表得到编码值后,在末尾加上两个 =
.
Base64 编码索引表 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
HEX
十六进制的简写, 在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F表示,其中: A~F
相当于十进制的 10~15
,这些称作十六进制数字。
例如十进制数57,在二进制写作111001,在16进制写作39。
参考资料
https://zh.wikipedia.org/wiki/Base64
http://www.ruanyifeng.com/blog/2007/10/ascii
unicode
and_utf-8.html
https://baike.baidu.com/item/UTF-8
欢迎拍砖~