day01-进制和编码

1.python代码运行方式

  • 脚本式
    python xxxx.py
  • 交互式

2.进制

计算机中底层所有的数据都是以010101的形式存在(图片、文本、视频等)

  • 二进制
  • 八进制
  • 十进制
  • 十六进制

2.1 进制转换

v1 = bin(25)  # 十进制转换为二进制
print(v1)  #"0b11001"
v2 = oct(23)  # 十进制转换为八进制
print(v2)  #"0o27"
v3 = hex(28)  # 十进制转化为十六进制
print(v3)  #"0x1c"

i1 = int("0b11001", base=2)  # 二进制转换为十进制
print(i1)  # 25
i2 = int("0o27", base=8)  # 八进制转换为十进制
print(i2)  # 23
i3 = int("0x1c", base=16)  # 十六进制转换为十进制
print(i3)  # 28

3.计算机中的单位

由于计算机中本质上所有的东西以二进制存储和操作的,为了方便对二进制值大小的表示,所以就搞了一些单位。

  • b(bit),位
1,1位
10,2位
111,3位
  • B(byte),字节
8位是一个字节
10010110,1个字节
10010110 10010110,2个字节
  • KB(kilobyte),千字节
1024个字节就是1个千字节
10010110 10010110 10010110 10010110 ..,1KB
1KB = 1024B = 1024 * 8b
  • M(Megabyte),兆
1024KB就是1M
1M = 1024KB = 1024 * 1024B
  • G(Gigabyte),千兆
1024M就是1G
1G = 1024MB = 1024 * 1024KB = 1024 * 1024 * 1024B
  • T(Terabyte),万亿字节
1024个G就是1T
  • 其他更大单位PB/EB/ZB/YB/BB/NB/DB不再赘述。

做个小练习:

  • 假设1个汉字需要2个字节(2B=16位来表示,如:1000101011001100),那么1G流量可以通过网络传输多少汉字呢?
1G = 1024M = 1024 * 1024KB = 1024 * 1024 * 1024B
每个汉字需要2个字节表示
1024 * 1024 * 1024/2,算出答案即可。

4.编码

编码,文字和二进制之间的一个对照表。

4.1 ascii编码

ascii规定使用1个字节来表示字母与二进制的对应关系。

00000000
00000001
00000010
........
11111111

2**8=256种可能

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 = 65536种可能
  • Ucs4
用固定的4个字节去表示一个文字

00000000 00000000 00000000 00000000     无
........

2**32 = 4294967296种可能

无论是Ucs2还是Ucs4都有缺点:浪费空间。
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个字节表示

具体压缩的流程:

  • 第一步:选择转换模板
unicode码范围         转换模板
0000 - 007F          0xxxxxxx
0080 - 07FF          110xxxxx 10xxxxxx
0800 - FFFF          1110xxxx 10xxxxxx 10xxxxxx
10000 - 10FFFF       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

注意:一般中文都使用第三个模板(3个字节),这也就是平时大家说中文在utf-8中会占3个字节的原因了。
  • 第二步:在模板中填入数据
- "武"  ->  6B66  ->  110101101100110
- 根据模板去套入数据
  1110xxxx 10xxxxxx 10xxxxxx
  1110xxxx 10xxxxxx 10100110
  1110xxxx 10101101 10100110
  11100110 10101101 10100110

4.5 python相关的编码

字符串(str)  "打篮球"               内部使用unicode处理    一般在内存
字节(byte)   b"sadajslkfahfald"    utf-8编码或gbk编码     一般用于文件或网络处理

v1 = "武"
v2 = v1.encode("utf-8")
v2 = v1.encode("gbk")

将一个字符串写入到一个文件中。

name = "嫂子热的满身大汉"
data = name.encode("utf-8")

file_object = open("log.txt", mode="wb") 
file_object.write(data)
file_object.close()
posted @ 2024-03-15 15:25  死不悔改奇男子  阅读(118)  评论(0编辑  收藏  举报