[oeasy]python0019_ 打包和解包_struct_pack_unpack
打包和解包
回忆上次内容
- 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 全都打出来
- 可以么?
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/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的更多相关文章
- python中*和**的打包和解包
python中的*和**,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的 一. 打包参数 * 的作用:在函数定义中,收集所有的位置参数到一个新的元组,并将这个元组赋值给变量arg ...
- [android]system.img文件的打包和解包
1:system.img的两种格式 system2_0.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-94 ...
- pak文件的打包和解包
pak格式的文件 一般游戏有资源 游戏素材会打包放进去 比如游戏语音 游戏多加点语音 多加一些贴图资源 外部文件实现的 素材--->pak文件--->用的时候从文件中取出来 文件的打包 ...
- unity学习 5.x依赖打包和解包
unity5已经封装好了接口,所以依赖打包并没有那么神秘和复杂了. 打包: 1.定义好资源的assetBundleName 2.BuildPipeline.BuildAssetBundles,指定资源 ...
- Day004_Linux基础_基础命令之tar打包解包
基础命令之 打包,和解包. tar zcvf 打包的参数 tar zcvf /tmp/etc.tar.gz /etc 将/etc/下的文件压缩成一个压缩包 z 通过gzip工具进行压缩 c 表示 ...
- Mtk Android 打包解包*.img
打包/解包 boot.img, system.img, userdata.img, or recovery.img [DESCRIPTION] MTK codebase编译出来的image必须使用MT ...
- 基于RTP的H264视频数据打包解包类
from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...
- Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口
Iterator(迭代器) 所有实现了Collection接口的容器都有一个iterator方法, 用来返回一个实现了Iterator接口的对象 Iterator对象称作迭代器, 用来方便的实现对容器 ...
- ionic 打包安卓包
一.配置环境: 先按照之前的文章,配置好环境需要: 二.安装 1. 这里前提是 需要安装 node (地址: http://nodejs.cn/download/) 命令: node -v // ...
- 【Maven】项目打包-war包-Jar包[IDEA将项目打成war包]
[Maven]项目打包-war包-Jar包[IDEA将项目打成war包] 2017年01月31日 00:21:06 阅读数:22912 标签: ideamaven发布博客插件 更多 个人分类: ❷ J ...
随机推荐
- .NET 9 预览版:打造云原生及人工智能 AI 平台
前言 微软发布了 .NET 9 首个预览版,分享.NET团队对 .NET 9 的初步愿景,该愿景将于今年年底在 .NET Conf 2024 上发布. 重点关注针对云原生和人工智能领域的应用程序开发以 ...
- 莫烦tensorflow学习记录 (5)什么是过拟合 (Overfitting)
什么是过拟合 (Overfitting) 莫烦讲的非常通俗易懂可以看看https://mofanpy.com/tutorials/machine-learning/tensorflow/intro-o ...
- 几个公司wiki知识库调研和感悟
@ 目录 需求背景 具体实现 经验&吐槽 小结 需求背景 公司准备做一个知识库,我这边调研了几个项目,如下 第一个是我们耳熟能详的confluence,但是好想要收费,先搁置 第二个是mind ...
- NSInvocation 返回值在ARC下面的释放问题
一.先看下面的代码 -(NSArray *) operationFromTakeoffAction:(NSString *) action AtPoint:(CGPoint) flightPoint ...
- 「C++」论高精度
大家好,我是Charzie.在编程领域,高精度计算是一个常见的问题.当标准的整型或浮点型无法满足我们的计算需求时,高精度计算就显得尤为重要.在C++中,虽然标准库没有直接提供高精度数据类型,但我们可以 ...
- 关于mybatis中的${}、#{},
mybatis作为一个轻量级的ORM框架,应用广泛,其上手使用也比较简单:一个成熟的框架,必然有精巧的设计,值得学习. 在使用mybatis框架时,在sql语句中获取传入的参数有如下两种方式: ${p ...
- 计算机网络实验一:vlan的创建与划分
这个是 pkt文件 有两道题 所以我是两个文件 https://pan.quark.cn/s/d4170897cb59 https://pan.quark.cn/s/da48878c77f5 发现 复 ...
- linux命令查看内存命令free -h whereis locate find查找命令
linux命令查看内存命令free -h whereis locate find查找命令 1.free -h root@hz-auto-eureka-test-03:/usr/local/tomca ...
- 「C++」复杂模拟【壹】
建议开启目录食用 阅读本文之前建议您先看这里,如果您已经看完了,那么就可以放心大胆的学习本文了. 我认为其实本文的难度还是比较大的,今天我们题是来自山东省省选,所以建议大家谨慎阅读,如果您是专业程序员 ...
- Linux 环境编程:errno的基本用法
背景 error是一个包含在<errno.h>中的预定义的外部int变量,用于表示最近一个函数调用是否产生了错误.若为0,则无错误,其它值均表示一类错误. errno只在函数返回错误时才有 ...