打包和解包
回顾上次内容
-
ASCII 由这样几类字符形成
- 英文大写字符
- 英文小写字符
- 数字
- 符号
-
电报时代对于英文、数字的编码
- 应用的是摩斯电码
-
这摩斯电码是 3 进制的编码方式
- 长短空
- 怎么演化成 ascii 这种 0101 的二进制编码的呢?🤔
回到 ASCII 码
-
电报传过来的信号须要记录下来
- 于是有了电传打字机(tele-typewriter)
- 电传打字机须要对立的编码字母和数字
-
ASCII 的第一个商业用途
- 是作为一个七位电传打字机 (tele-typewriter) 代码
-
要把滴、答、停的电报信号
- 变成 0 和 1 的二进制信号
ASCII 的演变(evolve)
-
1960 年 10 月 6 日
- 美国规范协会(ASA)X3 的首次会议
- ASCII 规范的工作开始了
-
美国规范协会
- 现为美国国家标准协会
- American National Standards Institute
- 简称 ANSI
- 开始敲定 ASCII 具体编码
- 贝尔公司次要经营电报电话
编码起源
-
第一次 (ASA X3.4-1963) 就明确
- 大小写字母之间只差一个位
- 这很重要
-
否则谬误编码一旦成为规范
-
所有利用这种谬误编码的文件
- 就都废掉了
-
-
我想把所有 ASCII 字符 0-127 全都打进去
- 能够么?
回顾 show.py
- 回顾编写 show.py
for n in range(0xff):
print(chr(n),end="")
if n % 16 == 0:
print()
- 的确能够进去
-
这输入靠的是
-
把序号转化成字符的函数
- chr
-
-
然而没有看到 0
- 实践上在 1 之前
- 好像被光明森林所淹没
- 我是否将字节解码 (decode) 来干这个事?
struct
- 首先是要取得从 0 到 127 的字节状态
-
struct 是一个包(module)
- 导入 struct 包
-
struct 是构造的意思
- 来自于 c 外面罕用类型的存储构造
- 这个 struct 怎么用呢?
pack
-
把数字变成字节的状态
- 把 0x61 这个数字变成字节的状态
-
“a” 不是字符吗?🤔
- 怎么成了字节了?
字节表示法
- 留神细节
-
留神 ”a” 后面还有一个 b
- “a” 是字符
- b”a” 是字节
- 这两类型齐全不同
- 字节 b ”a” 是什么呢?
字节状态
-
字节状态能够用两个 16 进制数来示意
-
b”a”
- 相当于 b ”\x61″
-
-
b”a” 和 b”\x61″ 是同样的一个字节
- 就是字符 ”a” 在字节里的样子
-
为了分明起见
- 把 b ”\x61″ 示意为 b ”a”
- 这样也就间接看到了字符😂
- 刚好 ord(“a”) 就是 0x61
- 如何了解 struct.pack 呢?
封包 pack
- 按要求把货色封进规定的封装外面
-
把数字封在 1 个 Byte 外面
- 察看他的字节状态
遍历
import struct
for n in range(0,128):
b = struct.pack("b",n)
print(b,end=",")
- 把从 0 -127 的数字都封到字节外面
-
能够把数字转化成字节状态
- 而后能够再把字节解码了
遍历后果
- 好多的字节呀~😄
-
从字节状态能够看到曾经有
-
0、1、2、3
- 这里很显著能看到 0
- 还有 0 后面的一堆符号
- A、B、C
- a、b、c
-
-
还有
- \r、\n、\t
- 这是啥意思?🤔
- 怎么还能有两个字符呢?
- 不论他
- 先加上换行
换行
-
从 0 数到 7
- 换 1 行
- 再从 0 数到 7
-
隐约看到了 ascii 码的构造
-
我不想看字节状态呢
- 我想看字符状态
-
-
须要对字节状态解码(decode)
-
也就是解包
- struct.unpack
-
解包
-
这又是一圈
- pack
- unpack
- 解包进去是序号
- 先把 0 -127 的数字都变成字节
封包再解包
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
- 好像被下面那片光明森林所淹没
- 这可真可怕!
- 咱们先去总结一下吧
总结
-
struct 包能够让咱们应用封包格局
-
把数字封包到字节里
- pack 函数就是封包
- unpack 函数就是解封
-
咱们通过封到不同字节的数字
- 遍历了一次 ascii 码
-
-
还是有那片彩色的区域
- 如同是一片光明森林!
- 那外面到底有些什么机密?🤔
- 咱们下次向光明森林区域进发!!👊
- 去筹备行装吧👋🏻
- 蓝桥 ->https://www.lanqiao.cn/teache…
- github->https://github.com/overmind19…
- gitee->https://gitee.com/overmind198…
- 视频 ->https://www.bilibili.com/vide… 作者:oeasy