进阶版:https://blog.csdn.net/youand_me/article/details/78890316

Python 中的 struct 模块

from struct import *

Python 提供了三个与 pack 和 unpack 相关的函数

1

2

3

struct.pack(fmt, v1, v2, ...)

struct.unpack(fmt, string)

struct.calcsize(fmt)

第一个函数 pack 负责将不同的变量打包在一起,成为一个字节字符串。

第二个函数 unpack 将字节字符串解包成为变量。

第三个函数 calsize 计算按照格式 fmt 打包的结果有多少个字节。

pack 操作

Pack 操作必须接受一个 template string 以及需要进行 pack 一组数据,这就意味着 pack 处理操作 定长 的数据

1

2

3

4

5

6

import struct

a = struct.pack("2I3sI", 12, 34, "abc", 56)

b = struct.unpack("2I3sI", a)

print b

上面的代码将两个整数 12 和 34,一个字符串 “abc” 和一个整数 56 一起打包成为一个字节字符流,然后再解包。其中打包格式中明确指出了打包的长度: "2I" 表明起始是两个 unsigned int , "3s" 表明长度为 4 的字符串,最后一个 "I" 表示最后紧跟一个 unsigned int ,所以上面的打印 b 输出结果是:(12, 34, ‘abc', 56),完整的 Python pack 操作支持的数据类型见下表。

如果想传入多个而且数量可变的参数,可以采用先将变量放入tuple中,再传给pack

args = ("H""ello world "5)

struct.pack("c12si"*args)

# 等价于

struct.pack("c12si""H""ello world "5)

计算字节大小

可以利用 calcsize 来计算模式 “2I3sI” 占用的字节数

1

print struct.calcsize("2I3sI") # 16

可以看到上面的三个整型加一个 3 字符的字符串一共占用了 16 个字节。为什么会是 16 个字节呢?不应该是 15 个字节吗?1 个 int 4 字节,3 个字符 3 字节。但是在 struct 的打包过程中,根据特定类型的要求,必须进行字节对齐(关于字节对齐详见 https://en.wikipedia.org/wiki/Data_structure_alignment) 。由于默认 unsigned int 型占用四个字节,因此要在字符串的位置进行4字节对齐,因此即使是 3 个字符的字符串也要占用 4 个字节。

再看一下不需要字节对齐的模式

1

print struct.calcsize("2Is") # 9

由于单字符出现在两个整型之后,不需要进行字节对齐,所以输出结果是 9。

unpack 操作

对于 unpack 而言,只要 fmt 对应的字节数和字节字符串 string 的字节数一致,就可以成功的进行解析,否则 unpack 函数将抛出异常。例如我们也可以使用如下的 fmt 解析出 a :

1

2

3

c = struct.unpack("2I2sI", a)

print struct.calcsize("2I2sI")

print # 16 (12, 34, 'ab', 56)

不定长数据 pack

如果打包的数据长度未知该如何打包,这样的打包在网络传输中非常常见。处理这种不定长的内容的主要思路是把长度和内容一起打包,解包时首先解析内容的长度,然后再读取正文。

打包变长字符串

对于变长字符在处理的时候可以把字符的长度当成数据的内容一起打包。

1

2

s = bytes(s)

data = struct.pack("I%ds" % (len(s),), len(s), s)

上面代码把字符 s 的长度打包成内容,可以在进行内容读取的时候直接读取。

解包变长字符串

1

2

int_size = struct.calcsize("I")

(i,), data = struct.unpack("I", data[:int_size]), data[int_size:]

解包变长字符时首先解包内容的长度,在根据内容的长度解包数据

为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:

Character   Byte order  Size and alignment

@   native  native            凑够4个字节

=   native  standard        按原字节数

<   little-endian   standard        按原字节数

>   big-endian  standard       按原字节数

!   network (= big-endian)

standard       按原字节数

使用方法是放在fmt的第一个位置,就像’@5s6sif’

python pack和unpack相关推荐

  1. python pack和unpack的用法

    #  按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) pack(fmt, v1, v2, ...) # 按照给定的格式(fmt)解析字节流string,返回解析出来的t ...

  2. python的pack和unpack用法

    python的pack和unpack用法 pack和unpack在处理二进制流中比较常用的封包.解包格式 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) pack(fm ...

  3. PHP: chr和pack、unpack那些事

    为什么80%的码农都做不了架构师?>>>    PHP是一门很灵活的语言.正因为它太灵活了,甚至有些怪异,所以大家对它的评价褒贬不一.其实我想说的是,任何一门语言都有它自身的哲学,有 ...

  4. PHP中的pack和unpack函数

    转载请注明文章出处:https://tlanyan.me/php-pack-a... PHP有两个重要的冷门函数:pack和unpack.在网络编程,读写图像文件等场景,这两个函数几乎必不可少.鉴于文 ...

  5. 解释一下pack和unpack

    pack/unpack runbase Framwork用pack和unpack来保存用户上次操作的值,用户上次操作的值会存在SysLastValue表中,这个功能确实蛮酷,不过今天差点被这个东西给整 ...

  6. socket中pack 和 unpack 的使用

    任何一款拥有socket操作能力的语言都有一个专门用于组包的函数,php也不例外! 用了很久php了却很少有机会用php进行一些二进制操作. 最近用php写一个socket客户端连接一个用C++语言开 ...

  7. python中struct.unpack的用法

    python中struct.unpack的用法 4/25/2009 12:18:21 PM Python中按一定的格式取出某字符串中的子字符串,使用struck.unpack是非常高效的. 1. 设置 ...

  8. python pack unpack_golang 仿python pack/unpack

    package includes import ("bytes" "encoding/binary" "fmt"_"os" ...

  9. php pack、unpack、ord 函数使用方法(二进制流接口应用实例)

    park,unpark,ord这3个函数,在我们工作中,用到它们的估计不多. 我在最近一个工作中,因为通讯需要用到二进制流,然后接口用php接收.当时在处理时候,查阅不少资料.因为它们使用确实比较少, ...

  10. C++的 pack 与 unpack的方法

    在使用 Cuda 的Thrust 进行加速时,需要将一些复杂信息从C++层传递到Cuda层,比如说 多个Device端的内存地址. 一种常用的方式是,使用device_vector 与 STL vec ...

最新文章

  1. c语言中如何自定义sort,c – 如何重载自定义std :: sort比较函数?
  2. BeanUtils的方法
  3. System Center 2012与vCenter Operations 产品功能对比
  4. 《第3选择》学习笔记
  5. boost::gregorian模块实现查找给定月份最后一天的测试程序
  6. linux文件属性之用户和组基础知识
  7. hping3工具DOS攻击实验
  8. 【项目合作】移动端人体姿态估计
  9. 继电反馈法自整定_用STM32F407玩控制—继电反馈法PID参数自动整定
  10. matlab 输入矩形序列,从python调用Matlab函数:“初始值设定项必须是矩形嵌套序列”...
  11. [bzoj1055][HAOI2008]玩具取名
  12. JAVA JSP javaweb餐厅点餐系统源码(点餐系统)点餐系统网上订餐系统在线订餐系统
  13. Spring集成activiti
  14. 系统分析设计——如何识别类
  15. 次世代游戏建模制作工作流程 1
  16. html有哪些好玩的地方,北京有什么好玩的地方旅游景点(北京之旅必去的10个旅游景点)...
  17. 用层次分析法分析如何选购电脑
  18. 荒野求生获得服务器信息,荒野求生游戏问答老贝出海时任务编码 | 手游网游页游攻略大全...
  19. 删除手机图片后保持图库不会出现黑图的方法。
  20. 5脚电磁继电器接线图(小电流小电压控制大电流大电压)

热门文章

  1. 【成长篇】选择一定很重要
  2. Android手机ram大小,安卓手机RAM容量演进史,如何从192MB走到16GB,HTC:我有话要说...
  3. 动态规划之《高楼扔鸡蛋》问题详解 LeetCode 887.鸡蛋掉落
  4. java后台管理系统做Excel导入
  5. java生日提醒_生日提醒功能
  6. 6.再来一题除法算术题
  7. 《Linux命令行与shell脚本编程大全(第3版)》读书笔记
  8. idea 内存溢出问题
  9. 模拟实现ATM系统——Java
  10. Julia数据可视化:Plots.jl包的使用