打包和解包

回忆上次内容

  • 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. 自动化部署elasticsearch三节点集群

    什么是Elasticsearch? Elasticsearch 是一个开源的分布式搜索和分析引擎,构建在 Apache Lucene 的基础上.它提供了一个分布式多租户的全文搜索引擎,具有实时分析功能 ...

  2. FFmpeg中的常见结构体

    代码基于FFmpeg5.0.1 目录 FFFormatContext AVFormatContext AVIOContext FFIOContext URLContext URLProtocol AV ...

  3. Android 12(S) ALooper AHandler AMessage(一)

    卧榻之侧岂容他人酣睡,到现在ALooper AHandler AMessage的工作原理一直都没搞懂,很慌!看他们的路径都在libstagefright/foundation下,作为一个foundat ...

  4. 【终极指南】使用Python可视化分析文本情感倾向

    本文分享自华为云社区<Python理解文本情感倾向的终极指南>,作者: 柠檬味拥抱. 情感分析是一种通过自然语言处理技术来识别.提取和量化文本中的情感倾向的方法.Python在这一领域有着 ...

  5. C# 关于图片转ICO的代码整理(无损,不需要第三方类库)

    概述(Overview) 感觉网上文章整理的不全,我这边做个专栏,专门做这个事情吧,节省大家搜索.筛选.整理的时间精力.有用可以点个赞.引用本文章请注明出处,谢谢. (I feel that the ...

  6. MyBatis实现MySQL表字段及结构的自动增删

    前言 在开发过程中,总会涉及到数据库表结构字段的增加或者删除,或者是索引的增加和减少,这个时候能把修改表结构字段这些工作都交给程序来进行,那能大大方便开发.正好有一个现成的工具可以在springboo ...

  7. C#.NET rabbit mq 持久化时报错 durable

    The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=406, text='PRECONDITI ...

  8. Future集合会等线程池执行完才开始遍历吗?

    先说结论:Future集合并不是等线程池执行完才开始遍历,而是线程池内的线程执行完一条Future集合就立即遍历一条 在使用线程池的业务场景下,我们经常需要获取线程执行的返回值,此时我们需要Calla ...

  9. 高德地图查询结果返回INVALID_USER_IP错误解决

    高德地图查询结果返回INVALID_USER_IP错误解决 方法是添加白名单.IP白名单出错,发送请求的服务器IP不在IP白名单内开发者在LBS官网控制台设置的IP白名单不正确.白名单中未添加对应服务 ...

  10. spark使用jdbc批次提交方式写入phoniex的工具类

    一.需求:spark写入phoniex 二.实现方式 1.官网方式 dataFrame.write .format("org.apache.phoenix.spark") .mod ...