24

浅谈几种常用的编码方式

 4 years ago
source link: https://www.tuicool.com/articles/a6zUzaq
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

浅谈几种常用编码方式

最近在做加解密这块的开发,使用频率最高的就是 Nodejscrypto 模块了,中间出现了很多种不同的编码方式。一直对这些编码方式处于熟练拼写的状态,但是到底有什么区别处于一知半解,借此机会正好整理下这之间的关系。

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。

参考资料

欢迎拍砖~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK