Python基本语法(四)——二进制与编码

目录

一、二进制

1.1 二进制基本介绍

1.2 二进制与10进制转换

1.3 二进制与16进制转换

二、bite及byte

三、编码表

3.1 编码及编码表定义

3.2 ASCII编码

3.3 GB2312

3.4 Unicode万国码

3.5 UTF-8

3.6 几种编码表的使用情况

四、编码与解码


一、二进制

1.1 二进制基本介绍

二进制即只有0和1,逢二进一

        1位二进制数据总共可表示2^1=2种状态,即0和1

        2位二进制数据总共可表示2^2=4种状态,即00,01,10,11

        以此类推,n位二进制可以表示2^n中状态,特别的,8位二进制数据可以表示2^8=256种状态,对应十进制数字0~255

1.2 二进制与10进制转换

0101 = 2^2+1=5

11010 = 2^4+2^3+0+2^1+0=16+8+0+2+0=26

相较于用公式算,直接记住二进制每一位下的“1”对应10进制的数字大小(即位权)能更快的计算

1.3 二进制与16进制转换

11010 = 16+8+2=26=16+10=1A

通过10进制过渡,一步步计算

11010 = 1  1010 = 1 (8+2) = 1   10 = 1  A=1A

每四位二进制数据对应一位十六进制数据,结合每位的位权,快速得出对应16进制关系

二、bite及byte

bit:计算机里用来存放1或0的最小存储单位(百兆宽带是用bit作单位的)

byte:字节,计算机最常用的由8个bit构成的存储单位(下载速度中KB,MB中的B指的就是byte)

三、编码表

3.1 编码及编码表定义

编码:本质就是让只认识0和1的计算机,能够认识人类使用的语言符号,并且将数据转化为二进制进行存储和传输

编码表:人类语言和二进制数据的对应关系

乱码的本质:解码器使用的编码表与编码器使用的编码表不一致导致混乱

3.2 ASCII编码

美国发明的,适用于英文,英文字母+数字+常用符号总共也就100来个,使用7个bit位2^7=128足够了,所以一个字节中会剩下一个bit位,默认为0

问题:只适用于英语,不适用于其他语言,尤其不适合中文,256位完全不够用

3.3 GB2312

中国出台的,用2个字节,2^{16}=65536代表65535个常用汉字,升级版是GBK码

3.4 Unicode万国码

将世界上所有的符号都收集纳入,可容纳100多万个符号。Unicode编码点分为17个平面(plane),每个平面包含216(即65536)个码位(code point)。17个平面的码位可表示为从U+xx0000到U+xxFFFF,其中xx表示十六进制值从00_{16}10_{16},共计17个平面,总计17×65536=1114112个码位。

17个平面中,第一个平面称为“基本多语言平面”(Basic Multilingual Plane,简称BMP),其余平面称为“辅助平面”(Supplementary Planes)。其中“基本多语言平面”(0~0xFFFF)中0xD800~0xDFFF之间的码位作为保留,未使用。

缺点是为迁就一些占用字节比较多的语言(比如中文),英文也要跟着占两个字节。比如要存储A,原本00010001就可以了,使用万国码就必须用两个字节:00000000 00010001,极大的浪费计算机存储空间。

3.5 UTF-8

一种针对Unicode的可变长度字符编码,可使用1~4个字节表示一个符号,根据符号选择字节长度,可兼容ACSII编码

UTF-8的编码规则:

(1) 对于ASCII码中的符号,使用单字节编码,其编码值与ASCII值相同。其中ASCII值的范围为0~0x7F,所有编码的二进制值中第一位为0(这个正好可以用来区分单字节编码和多字节编码)。

(2) 其它字符用多个字节来编码(假设用N个字节),多字节编码需满足:第一个字节的前N位都为1,第N+1位为0,后面N-1 个字节的前两位都为10,这N个字节中其余位全部用来存储Unicode中的码位值。

字节数UnicodeUTF-8编码
1000000-00007F0xxxxxxx
2000080-0007FF110xxxxx 10xxxxxx
3000800-00FFFF1110xxxx 10xxxxxx 10xxxxxx
4010000-10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

3.6 几种编码表的使用情况

计算机是有自己的工作区的,这个工作区被称为“内存”。数据在内存当中处理时,使用的格式是Unicode,统一标准。

数据在硬盘上存储,或者是在网络上传输时,用的是UTF-8,因为节省空间。但你不必操心如何转换UTF-8和Unicode,当我们点击保存的时候,程序已经“默默地”帮我们做好了编码工作。

一些中文的文件和中文网站,还在使用GBK,和GB2312。

四、编码与解码

encode()与decode()函数

编码,即将人类语言转换为计算机语言,就是【编码】encode();反之,就是【解码】decode()

print('吴枫'.encode('utf-8'))  #将吴枫’按照utf-8格式编码
print('吴枫'.encode('gbk'))    #将‘吴枫’按照gbk格式编码
print(b'\xe5\x90\xb4\xe6\x9e\xab'.decode('utf-8'))  #将‘\xe5\x90\xb4\xe6\x9e\xab’按照utf-8格式解码
print(b'\xce\xe2\xb7\xe3'.decode('gbk'))  #将‘\xce\xe2\xb7\xe3’按照gbk格式解码

将人类语言编码后得到的结果,有一个相同之处,就是最前面都有一个字母b,比如b'\xce\xe2\xb7\xe3',这代表它是bytes(字节)类型的数据。

print(type('吴枫'))
print(type(b'\xce\xe2\xb7\xe3')) 

<class 'str'>
<class 'bytes'>


 

  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值