打包和解包
回忆上次内容
- ASCII 由这样几类字符构成
- 电报时代对于英文、数字的编码

- 这摩斯电码是3进制的编码方式
- 怎么演化成ascii这种0101的二进制编码的呢?
回到 ASCII 码
- 电报传过来的信号需要记录下来
- 于是有了电传打字机(tele-typewriter)
- 电传打字机需要统一的编码字母和数字
- ASCII的第一个商业用途
- 是作为一个七位电传打字机(tele-typewriter)代码

ASCII的演化(evolve)
- 1960年10月6日
- 美国标准协会(ASA)X3的首次会议
- ASCII标准的工作开始了
- 美国标准协会
- 现为美国国家标准协会
- American National Standards Institute
- 简称ANSI
- 开始敲定ASCII具体编码

编码来源

- 否则错误编码一旦成为标准
- 我想把所有 ASCII 字符 0-127 全都打出来
回忆show.py
for n in range(0xff):
print(chr(n),end="")
if n % 16 == 0:
print()

- 这输出靠的是
- 但是没有看到0
- 我能否将字节解码(decode)来干这个事?
struct
- 首先是要获得从0到127的字节状态
- struct 是一个包(module)

- struct是结构的意思
- 来自于c里面常用类型的存储结构
- 这个struct怎么用呢?
pack


字节表示法


字节形态


- 为了清楚起见
- 把b"\x61"表示为b"a"
- 这样也就直接看到了字符
- 刚好ord("a") 就是 0x61
- 如何理解struct.pack呢?
封包pack

遍历
import struct
for n in range(0,128):
b = struct.pack("b",n)
print(b,end=",")

遍历结果

- 从字节状态可以看到已经有
- 还有
- \r、\n、\t
- 这是啥意思?
- 怎么还能有两个字符呢?
- 不管他
- 先加上换行
换行


- 隐约看到了ascii码的结构
- 需要对字节状态解码(decode)
解包

封包再解包
import struct
for n in range(0,127):
b = struct.pack("b",n)
c = struct.unpack("b",b)[0]
print(chr(c),end="")
if n % 16 == 0:
print()

封包再解码
import struct
for n in range(0,127):
b = struct.pack("b",n)
s = b.decode("ascii")
print(s,end="")
if n % 16 == 0:
print()

- 和原来chr方法得到的结果差不多
- 但是没有看到字符0
- 我们先去总结一下吧
总结

- 还是有那片黑色的区域
- 我们下次向黑暗森林区域进发!!
- 去准备行装吧
- 蓝桥->https://www.lanqiao.cn/teacher/3584
- github->https://github.com/overmind1980/oeasy-python-tutorial
- gitee->https://gitee.com/overmind1980/oeasypython
- 视频->https://www.bilibili.com/video/BV1CU4y1Z7gQ 作者:oeasy