关于python:oeasypython0019-打包和解包structpackunpack

3次阅读

共计 1906 个字符,预计需要花费 5 分钟才能阅读完成。

打包和解包

回顾上次内容

  • 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
正文完
 0