打包和解包

回忆上次内容

  • 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​

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码

编辑

  • 还是有那片黑色的区域
  • 好像是一片黑暗森林!
  • 那里面到底有些什么秘密?

[oeasy]python0019_ 打包和解包_struct_pack_unpack的更多相关文章

  1. python中*和**的打包和解包

    python中的*和**,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的 一. 打包参数 * 的作用:在函数定义中,收集所有的位置参数到一个新的元组,并将这个元组赋值给变量arg ...

  2. [android]system.img文件的打包和解包

    1:system.img的两种格式 system2_0.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-94 ...

  3. pak文件的打包和解包

    pak格式的文件 一般游戏有资源 游戏素材会打包放进去 比如游戏语音 游戏多加点语音  多加一些贴图资源 外部文件实现的 素材--->pak文件--->用的时候从文件中取出来 文件的打包 ...

  4. unity学习 5.x依赖打包和解包

    unity5已经封装好了接口,所以依赖打包并没有那么神秘和复杂了. 打包: 1.定义好资源的assetBundleName 2.BuildPipeline.BuildAssetBundles,指定资源 ...

  5. Day004_Linux基础_基础命令之tar打包解包

    基础命令之 打包,和解包. tar zcvf 打包的参数  tar zcvf /tmp/etc.tar.gz /etc  将/etc/下的文件压缩成一个压缩包 z  通过gzip工具进行压缩 c 表示 ...

  6. Mtk Android 打包解包*.img

    打包/解包 boot.img, system.img, userdata.img, or recovery.img [DESCRIPTION] MTK codebase编译出来的image必须使用MT ...

  7. 基于RTP的H264视频数据打包解包类

    from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...

  8. Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口

    Iterator(迭代器) 所有实现了Collection接口的容器都有一个iterator方法, 用来返回一个实现了Iterator接口的对象 Iterator对象称作迭代器, 用来方便的实现对容器 ...

  9. ionic 打包安卓包

    一.配置环境: 先按照之前的文章,配置好环境需要: 二.安装 1. 这里前提是 需要安装  node (地址: http://nodejs.cn/download/) 命令: node -v   // ...

  10. 【Maven】项目打包-war包-Jar包[IDEA将项目打成war包]

    [Maven]项目打包-war包-Jar包[IDEA将项目打成war包] 2017年01月31日 00:21:06 阅读数:22912 标签: ideamaven发布博客插件 更多 个人分类: ❷ J ...

随机推荐

  1. Android 13 - Media框架(21)- ACodec(三)

    关注公众号免费阅读全文,进入音视频开发技术分享群! 这一节我们一起来了解 ACodec 是如何通过 configureCodec 方法配置 OMX 组件的,因为 configureCodec 代码比较 ...

  2. ProcessStartInfo 类

    定义 命名空间: System.Diagnostics 程序集: System.Diagnostics.Process.dll 指定启动进程时使用的一组值. C#复制   public sealed ...

  3. JavaSE的运算符

    [Top] 算术运算 分类 运算符 算数运算符 * / + - % ++ -- 赋值运算符 +=, -=, /=, *=, %=(扩展赋值运算符), = 比较(关系)运算符 == != > &l ...

  4. 01-布局扩展-用calc来计算实现双飞翼布局

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  5. ABC340

    E 我们可以知道每一个点在每一轮加多少,具体如下: 假如现在操作的点的为 \(k\).那么所有的数都至少会加 \(\dfrac{A_k}{n}\).但是肯定有剩的,剩了 \(A_k \mod n\). ...

  6. VIVO IQOO 5G 开关

    VIVO IQOO 5G 开关 在拨号盘输入*#*#2288#*#*,然后点击网络模式选择. -

  7. .net core (.net6) 读取配置文件 appsettings.json

    .net core (.net6) 读取配置文件 appsettings.json 新建个工具类,方便其它地方使用,代码如下 AppHelper: namespace net6mvc.Utils { ...

  8. work07

    day08作业: 必做题:============================================================ 第一题: 定义一个字符串s = "Hell ...

  9. 开源一款功能强大的 .NET 消息队列通讯模型框架 Maomi.MQ

    目录 文档说明 导读 快速开始 消息发布者 IMessagePublisher 连接池 消息过期 事务 发送方确认模式 独占模式 消费者 消费者模式 事件模式 分组 消费者模式 消费.重试和补偿 消费 ...

  10. Unity UI优化

    UI优化 动静分离.拆分UI.预加载.字体拆分.滚屏优化.网格重构优化.展示关闭优化.对象池.贴图优化.图集拼接优化.UI业务逻辑中GC优化等. 一.动静分离 ** 问题:**unity中UGUI系统 ...