day04 进制和编码
目标:了解一些常见名词背后的含义。
1.python代码运行方式
- 脚本式
python3~ /PyCharm软件/学习Python/4.1.py
源文件上右键----点击run xx即可运行
- 交互式
1、cmd进入命令行,输入python回车,即可进入交互式环境
2、输入print("hello world")回车,即可运行
3、输入exit()回车,即可退出交互式环境
2.进制
计算机中底层所有的数据都是以010101
的形式存在(图片,文本,视频等)。
10进制:整型
2进制,8进制,16进制:字符串
v1 = bin(25) # 十进制转换为二进制
print(v1) # "0b11001"
v2 = oct(23) # 十进制转换为八进制
print(v2) # "0o27"
v3 = hex(28) # 十进制转换为十六进制
print(v3) # "0x1c"
i1 = int("0b11001", base=2) # 25
i2 = int("0o27", base=8) # 23
i3 = int("0x1c", base=16) # 28
print(i1, i2, i3)
3.计算机中的单位
- b(bit) 位
1,1位
10 ,2位
111, 3位
- B (byte) 字节
8位 为一个字节。
10010110 ,1个字节
10010110 10010110 , 2个字节
- KB(kilobyte) 千字节
1024个字节为 一个千字节。
10010110 10010110 10010110 ...,1KB
1KB = 1024B = 1024 * 8b
- M (Megabyte) 兆
1024KB 就是 1M
1M = 1024KB = 1024 * 1024 * 8b
- G (Gigabyte) 千兆
1024M 就是 1G
1G = 1024M = 1024 * 1024KB
- 还有更大的单位,TB,PB,EB,ZB,YB,BB,NB,DB
练习:
- 假设1个汉字需要2个字节(2B=16位来表示,如: 1000101011001100), 那么1G流量可以通过网络传输多少汉字呢? (计算机传输本质上也是二进制)
1G = 1024M = 1024*1024KB = 1024*1024*1024 B
1个汉字需要2个字节
print(1024*1024*1024 / 2)
# 536870912.0
- 假设1个汉字需要2个字节(2B=16位来表示,如: 1000101011001 100),那么500G硬盘可以存储多少个汉字?
print((1024*1024*1024 /2)*500)
# 268435456000.0
4.编码
编码,文字和二进制之间的一个对照表。
4.1 ASCII编码
规定使用1个字节来表示字母与二进制的对应关系。
https://c.biancheng.net/c/ascii/
4.2 gb-2312
编码
gb-2312
编码,由国家信息标准委员会制作(1980年)。
gbk
编码,对gb2312
进行扩展,包含了中日韩等文字(1995年)。
在与二进制做对应关系时,由如下逻辑:
-
单字节表示,用一个字节表示对应关系。$$2^8= 256$$
-
双字节表示,用两个字节表示对应关系。$$2^{16} = 65536$$中可能性。
4.3 unicode
unicode
也被称为万国码,为全球的每个文字都分配了一个码位 (二进制表示)。
- ucs2
用固定的2个字节去表示一个文字。
00000000 00000000 无
...
2^16 = 65535
- ucs4
用固定的4个字节去表示一个文字。
00000000 00000000 00000000 00000000 无
...
2^32 = 4294967296
无论是ucs2
还是ucs4
都有缺点: 浪费空间
文字 十六进制 二进制
A 0041 01000001
A 0041 00000000 01000001
A 0041 00000000 00000000 00000000 01000001
unicode的应用:在文件存储和网络传输时,不会直接使用unicode,而在内存中会有unicode。
4.4 utf-8编码
包含所有文字和二进制的对应关系,全球应用最广泛的一种编码。
本质上:utf-8是对unicode的压缩,用尽量少的二进制去与文字进行对应。
unicode码位范围 utf-8
0000 - 007F 用1个字节表示
0080 - 07FF 用2个字节表示
0800 - FFFF 用3个字节表示
10000 - 10FFFF 用4个字节表示
具体压缩的流程:
- 第一步:选择转换模板
码位范围(十六进制) 转换模板
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
10000 - 10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
例如:
对应的unicode: 选择模板:
"0042" 第一个模板
"01E3" 第二个模板
"6B66" 第三个模板
"9F50" 第三个模板
"1F606" 第四个模板
注意:一般 中文 都使用第三个模板(3个字节),这也就是平时大家说中文在utf-8中会占3个字节的原因。
- 第二步:在模板中填入数据
-武 "6B66" -> 110 101101 100110
- 根据模板去套入数据
1110xxxx 10xxxxxx 10xxxxxx
1110xxxx 10xxxxxx 10100110
1110xxxx 10101101 10100110
11100110 10101101 10100110
在UTF-8中 武"6B66" -> 11100110 10101101 10100110
4.5 Python相关的编码
字符串(str) "alex" unicode处理 一般在内存
字节(byte) b'alex' utf-8编码 or gbk编码 一般用于文件或网络处理
v1 = "武"
v2 = "武".encode("utf-8") #b'\xe6\xad\xa6'
v3 = "武".encode("gbk") #b'\xce\xe4'
将一个字符串写入到一个文件中。
str = "完成今日任务"
data = str.encode("utf-8")
# 打开一个文件
file_object = open("D:/PyCharm软件/学习Python/log.txt", mode="wb")
# 在文件中写内容
file_object.write(data)
# 关闭文件
file_object.close()
#log.txt显示
完成今日任务
总结
本章的知识点属于理解为主,了解这些基础之后有利于后面知识点的学习,接下来对本节所有的知识点进行归纳总结:
-
计算机上所有的东西最终都会转换成为二进制再去运行。
-
ascii编码、unicode字符集、 utf-8编码本质上都是字符与二进制的关系。
- ascii, 字符和二进制的对照表。
- unicode, 字符和二进制(码位)的对照表。
- utf-8, 对unicode字符 集的码位进行压缩处理,间接也维护了字符和二进制的对照表。
-
ucs2和ucs4指的是使用多少个字节来表示unicode字符集的码位。
-
目前最广泛的编码为: utf-8, 他可以表示所有的字符 且存储或网络传输也不会浪费资源 (对码位进行压缩了)。
-
二进制、八进制、十进制、十六进制其实就是进位的时机不同。
-
基于Python实现二进制、八进制、十进制、十六进制之间的转换。
-
一个字节8位。
-
计算机中常见单位b/B/KB/M/G的关系。
-
汉字,用gbk编码需要用2个字节;用utf-8编码需要用3个字节。
-
基于Python实现将字符串转换为字节(utf-8编码)
# 字符串类型 name = "佩奇" print(name) # 佩奇 # 字符串转换为字节类型 data = name.encode("utf-8") print(data) # b'\xe4\xbd\xa9\xe5\xa5\x87' utf8,中文3个字节 # 把字节转换为字符串 old = data.decode("utf-8") print(old) # 佩奇
-
基于Python实现将字符串转换为字节(gbk编码)
# 字符串类型 name = "佩奇" print(name) # 佩奇 # 字符串转换为字节类型 data = name.encode("gbk") print(data) # b'\xc5\xe5\xc6\xe6' gbk,中文2个字节 # 把字节转换为字符串 old = data.decode("gbk") print(old) # 佩奇