Python全栈笔记(四)

第四章 进制和编码

1. 进制

1.1 初识进制

谈到进制相信大家都不陌生,因为我们在上小学的时候老师就教会我们大家:满10进位。

今天咱们一起来了解下搞IT的程序员常说的几种进制:

  • 二进制,满二进位
  • 八进制,满八进位
  • 十进制,满十进位
  • 十六进制,满十六进位

img

从上面的进制关系对照表可以发现,不同进制之间其实就进位的时机不同,分别:满2、8、10、16进位。按照不同进制在表示同个数值时,会出现不同的值,例如:常说的数字14(十进制)用不同进制表示分别为:

二进制:1110
八进制:17
十进制:14
十六进制:e

1.2 进制的作用

进制之间是什么以及进制之间的关系大家搞明白了,但紧接着问题也来了,计算机是不是有毛病,搞这么多进制干嘛?就用咱们大家熟悉的十进制多好,非要搞出这么多进制来。

哈哈哈,每个刚开始学编程的同学都会有这样的疑问,接下来我就来给大家一点点解释。

  • 关于十进制:在计算机诞生前,我们所有的计算都是通过人脑来实现。所以我们从小就开始学习数学,例如:12345678910、1+1=2等,其实就是十进制。把人类的大脑都培养成懂得十进制运算,这样人与人之间进行交流时候,就可以快速相互交换信息了。
  • 关于二进制:计算机诞生,人类创造计算机就是为了模拟人脑来进行一些操作,但计算机被创造出来时只能懂得二进制,也就是一大堆的01010等,所以我们平时在计算机上想要实现 8 + 13 = 21功能,在计算机的内部会将它转换为二进制1000 和 1101之间的计算,本质上计算机中的一些行为都是以二进制来实现。
  • 关于八进制:计算机中对数据另一种表示形式,一般写代码用不到,可暂忽略。(某些设备或PIC编码等场景有用到)。
  • 关于十六进制:由于计算机中本质上存储的都是二进制,一般在表示二进制时会使用十六进制,因为他用更短内容可以表示的数据更多,例如:二进制 100010001000101 用十六进制表示只需要 4445即可。

注意:计算机是由很多二极管组成,可以把二极管看成 灯,灯亮表示1;灯不亮表示0,计算机内部运行本质就是通过这种形式实现。其实也类似于古时候打仗,多个烽火台上的火把有没有被点亮,点亮的每一个火把都代表了不同的含义。
img

2. 计算机中的单位

由于计算机中本质上所有的东西以为二进制存储和操作的,为了方便对于二进制值大小的表示,所以就搞了一些单位,例如:流量还有多少M、硬盘容量有1T、计算机8G内存等、宽带是200M、千兆网络等。

计算机中表示对于二进制大小的常见单位有:

  • b(bit),位

      表示二进制有多少位,例如:      
      01101     就是 5位 = 5b      
      011011010 就是 9位 = 9b
    
  • B(byte),字节

      8位就是1个字节,例如:  
      10100101                就是 8位 = 8b = 1B= 1个字节  
      1010010110100101        就是 16位 = 16b = 2B= 2个字节
    
  • KB(Kilobyte),千字节

      1024个字节就是1千字节(1KB),即:  
      1 KB = 1024 B = 1024*8 b
    
  • M(Megabyte),兆

      1024个千字节就是1兆(1M),即:  
      1M = 1024 KB = 1024 * 1024 B = 1024 * 1024 * 8 b
    
  • G(Gigabyte),千兆

      1024个兆就是1千兆(1G),即:  
      1G = 1024 M = 1024 * 1024 KB = 1024 * 1024 * 1024 B = 1024 * 1024 * 1024 * 8 b
    
  • T(Terabyte),万亿字节

      1024个G就是1T
    
  • …其他更大单位 PB/EB/ZB/YB/BB/NB/DB 不再赘述。

学完上面的这些单位之后,是不是就了解了平时大家说的自己有1G流量是啥意思了。

做个小练习:假设1个汉字需要2个字节(2B=16位来表示,如:1000101011001100),那么1G流量可以通过网络传输多少汉字呢?(计算机传输本质上也是二进制)

解答:     
已知 1G = 1024 MB = 1024 * 1024 KB = 1024 * 1024 * 1024 B 且 2B表示一个汉字。    
所以 1024 * 1024 * 1024 / 2 = 536870912,即:1G流量可以传输536870912个汉字。

3. 编码

我们知道计算机中所有的数据本质上都是以二进制存在,那么在计算机上写的 文字、符号、字母、数字 等最终都会需要转化为二进制,然后再去执行二进制。

3.1 ascii编码

全世界第一台计算机是在美国诞生,诞生之初计算机只能支持英语,也就是说只能支持 符号、字母、数字,不支持:汉语、日语、汉语、泰语等,由于计算机本质上全部都是二进制操作,所以当时做了一张 字符 和 二进制的对照表(ascii编码)。

  • ascii码表中的256个对应关系,足以支持所有的英文操作了

      ascii码规定用8位来表示一个字符。因为每一位有0/1两种可能,8位就可以支持256种可能,即:  
      从 0000000、00000001、00000010 ~ 11111111 有256个,ascii就是这些二进制和字符来做的对应关系。
    
  • 表中没有展示出二进制,按顺序仅分别显示了 十、十六、八进制,如果包含二进制关系的话,分别应该有:

      二进制     十进制  
      00000000        0  
      00000001        2  
      ...  
      11111111        255
    

注意:ascii码中的 0 ~ 9 指的不是数字而是字符串"1"、"2"..."9" 与 二进制的对应关系。例如:

  • 获取整数9对应的二进制时,直接通过 十进制和二进制的关系转换,即:1001
  • 获取字符串”9”对应的二进制时,直接通过ascii码去找,即:00111001。

3.2 unicode字符集

由于ascii码只能表示256中字符对照关系,无法表示其他国家的文字,所有为了能让计算机支持全世界任意的文字就搞出来了一个unicode(字符集),他为全世界已知语言的所有字符都分配了一个码位(相当于是一个身份证ID),码位本质上也是个二进制。

读到这里,你可能会感觉unicode字符集 和 ascii编码一样,但其实字符集和编码还是有区别,如下:

  • ascii编码,直接是字符和二进制的对照表,此二进制可在计算机中用于内存计算、硬盘存储、网络传输等。

  • unicode字符集,是字符和码位的对应关系,码位本质上也是二进制,此二进制可在计算机中用于内存计算,但一般不会做硬盘存储和网络传输(为什么呢?下面有讲解)。

  • utf-8编码,是对unicode字符集的码位进行转换处理得到的二进制,此二进制可用于 内存计算硬盘存储网络传输等。

初步了解ascii编码、unicode字符集、utf-8编码关系之后,接下来对每个小点在进行解释。

接下来重点说unicode字符集,我们知道unicode字符集中包含了全世界所有的字符和码位的对应关系,这其中码位至关重要,因为码位必须足以支持全世界的字符。

  • 起初unicode字符集固定使用2个字节来表示码位,即:ucs2。

    ucs2用2个字节表示码位,所以码位能表示从 0000000000000000 至 1111111111111111 共 2**16=65525种可能,同时意味着ucs2能表示65535个字符。
    用十六进制表示这个范围的话就是:0000 ~ FFFF。
    
    ucs2中字符和码位的对应关系参见:
    http://www.columbia.edu/kermit/ucs2.html
    
  • 后来unicode使用4个字节表示所有字符,即:ucs4。

    因为随着时间的推移,发现的字符越来越多,这65535不够用了。所以就有了ucs4,他使用固定4个字节表示码位,码位就可以表示 2**32 = 4294967296 种可能,范围如下:  
    二进制表示   00000000 00000000 00000000 00000000 ~ 11111111 11111111 11111111 11111111  十六进制表示                            00000000 ~ ffffffff  
    
    ucs4中字符和码位的具体对应关系参见:      
    https://unicode-table.com/en/#00A5      
    https://www.unicode.org/charts/
    

截止2019年5月unicode已收集137929个字符,也就说ucs4还没被占满,如果发现其他的文字还可以继续扩增。

注意:ucs4其实是对ucs2的一个扩展,ucs4默认使用4个字节表示码位而ucs2用2个字节表示码位。 对于ucs2的65535个码位,ucs4会在ucs2表示的码位前加 0,即:ucs2:01101011 01100110 变为 ucs4:00000000 00000000 01101011 01100110; 对于第65535后面的码位,则ucs4在ucs2基础上在进行扩增

写在最后,一般情况下用ucs2可以满足常见的文字,但如果想要表示更全/更多的话,肯定选择ucs4,并且现在越来越多的人都开始选择使用ucs4,例如:想要在系统中支持emoji图标,肯定要支持ucs4。

ucs4的优缺点:

  • 缺点:因为都使用4个字节表示码位,同样的字符的码位会更占空间。所以,计算机中再网络传输硬盘存储时都不会用unicode字符集的码位存储,而是把码位转换(压缩)成utf-8等编码的二进制再进行传输和硬盘存储。
  • 优点:可以表示所有字符并且长度固定4字节,方便内存中进行数据计算(不必担心太占用内存空间,因为内存占用的计算的数据一般不会太大)。

注:网络传输指的是通过网络发送一段文字等消息; 硬盘存储指的是把一些文档等信息保存到硬盘上。

3.3 utf-8编码

在上面讲unicode字符集时,有简单提到过:utf-8编码其实就是对unicode字符集的码位进行压缩加工处理得到的,把二进制码位中不必要位去掉。这样一来,utf-8既可以表示所有的字符,又可以进行 内存计算、网络传输、硬盘存储了,所以,这也是为什么utf-8编码可以在全球的广泛的应用。

总感觉utf-8是站在巨人unicode肩膀上功成名就的!!!

utf-8,是一套以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节,对于码位进行编码时分为两步:

  • 第一步:根据码位选择转换模板

      码位范围(十六进制)                转换模板   
      0000 ~ 007F              0XXXXXXX   
      0080 ~ 07FF              110XXXXX 10XXXXXX   
      0800 ~ FFFF              1110XXXX 10XXXXXX 10XXXXXX  
      10000 ~ 10FFFF            11110XXX 10XXXXXX 10XXXXXX 10XXXXXX  
        
      注意:一般中文都使用第三个模板(3个字节),这也就是平时大家说中文在utf-8中会占3个字节的原因了。
    
  • 第二步

    :码位以二进制展示,再根据模板进行转换

除了utf-8之外,其实还有一些其他的 utf-7/utf-16/utf-32 等编码,他们跟utf-8类似,但没有utf-8应用广泛。

4. 总结

本章的知识点属于理解为主,了解这些基础之后有利于后面知识点的学习,接下来对本节所有的知识点进行归纳总结:

  1. 计算机上所有的东西最终都会转换成为二进制再去运行。
  2. ascii编码、unicode字符集、utf-8编码本质上都是字符与二进制的关系。
    • ascii,字符和二进制的对照表。
    • unicode,字符和二进制(码位)的对照表。
    • utf-8,对unicode字符集的码位进行压缩处理,间接也维护了字符和二进制的对照表。
  3. ucs2和ucs4指的是使用多少个字节来表示unicode字符集的码位。
  4. 目前最广泛的编码为:utf-8,他可以表示所有的字符且存储或网络传输也不会浪费资源(对码位进行压缩了)。
  5. 二进制、八进制、十进制、十六进制其实就是进位的时机不同。
  6. 一个字节8位
  7. b/B/KB/M/G的关系。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值