8天学习python笔记04

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显示
完成今日任务
总结

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

  1. 计算机上所有的东西最终都会转换成为二进制再去运行。

  2. ascii编码、unicode字符集、 utf-8编码本质上都是字符与二进制的关系。

    • ascii, 字符和二进制的对照表。
    • unicode, 字符和二进制(码位)的对照表。
    • utf-8, 对unicode字符 集的码位进行压缩处理,间接也维护了字符和二进制的对照表。
  3. ucs2和ucs4指的是使用多少个字节来表示unicode字符集的码位。

  4. 目前最广泛的编码为: utf-8, 他可以表示所有的字符 且存储或网络传输也不会浪费资源 (对码位进行压缩了)。

  5. 二进制、八进制、十进制、十六进制其实就是进位的时机不同。

  6. 基于Python实现二进制、八进制、十进制、十六进制之间的转换。

  7. 一个字节8位。

  8. 计算机中常见单位b/B/KB/M/G的关系。

  9. 汉字,用gbk编码需要用2个字节;用utf-8编码需要用3个字节。

  10. 基于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)  # 佩奇
    
  11. 基于Python实现将字符串转换为字节(gbk编码)

    # 字符串类型
    name = "佩奇"
    print(name)  # 佩奇
    # 字符串转换为字节类型
    data = name.encode("gbk")
    print(data)  # b'\xc5\xe5\xc6\xe6'  gbk,中文2个字节
    
    # 把字节转换为字符串
    old = data.decode("gbk")
    print(old)  # 佩奇
    
    
posted @ 2024-12-31 17:40  LUO-YY  阅读(34)  评论(0)    收藏  举报