欢迎光临散文网 会员登陆 & 注册

[oeasy]python0019_ 打包和解包_struct_pack_unpack

2022-11-23 10:32 作者:oeasy  | 我要投稿

打包和解包

回忆上次内容

  • ASCII 由这样几类字符构成

    • 英文大写字符

    • 英文小写字符

    • 数字

    • 符号

  • 电报时代对于英文、数字的编码

    • 使用的是摩斯电码

  • 这摩斯电码是3进制的编码方式

    • 长短空

  • 怎么演化成ascii这种0101的二进制编码的呢?🤔

回到 ASCII 码

  • 电报传过来的信号需要记录下来

    • 于是有了电传打字机(tele-typewriter)

    • 电传打字机需要统一的编码字母和数字

  • ASCII的第一个商业用途

    • 是作为一个七位电传打字机(tele-typewriter)代码

  • 要把滴、答、停的电报信号

    • 变成0和1的二进制信号

ASCII的演化(evolve)

  • 1960年10月6日

    • 现为美国国家标准协会

    • American National Standards Institute

    • 简称ANSI

    • 美国标准协会(ASA)X3的首次会议

    • ASCII标准的工作开始了

    • 美国标准协会

    • 开始敲定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"\x61"

    • b"a"

  • b"a" 和 b"\x61" 是同样的一个字节

    • 就是字符"a"在字节里的样子

  • 为了清楚起见

    • 把b"\x61"表示为b"a"

    • 这样也就直接看到了字符😂

    • 刚好ord("a") 就是 0x61

  • 如何理解struct.pack呢?

封包pack

  • 按要求把东西封进规定的封装里面

  • 把数字封在1个Byte里面

    • 观察他的字节状态

遍历

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

  • 把从0-127的数字都封到字节里面

  • 可以把数字转化成字节状态

    • 然后可以再把字节解码了

遍历结果

  • 好多的字节呀~😄

  • 从字节状态可以看到已经有

    • 这里很明显能看到0

    • 还有0前面的一堆符号

    • 0、1、2、3

    • A、B、C

    • a、b、c

  • 还有

    • \r、\n、\t

    • 这是啥意思?🤔

    • 怎么还能有两个字符呢?

    • 不管他

  • 先加上换行

换行

  • 从0数到7

    • 换1行

    • 再从0数到7

  • 隐约看到了ascii码的结构

    • 我想看字符状态

    • 我不想看字节状态呢

  • 需要对字节状态解码(decode)

    • struct.unpack

    • 也就是解包

解包

  • 这又是一圈

    • pack

    • unpack

  • 解包出来是序号

  • 先把0-127的数字都变成字节

封包再解包

import structfor 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包可以让我们使用封包格式

    • 遍历了一次ascii码

    • pack函数就是封包

    • unpack函数就是解封

    • 把数字封包到字节里

    • 我们通过封到不同字节的数字

  • 还是有那片黑色的区域

    • 好像是一片黑暗森林!

    • 那里面到底有些什么秘密?🤔

  • 我们下次向黑暗森林区域进发!!👊

  • 去准备行装吧👋🏻

  • 蓝桥->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


[oeasy]python0019_ 打包和解包_struct_pack_unpack的评论 (共 条)

分享到微博请遵守国家法律