Python中struct模块对字节流/二进制流的操作教程


Posted in Python onJanuary 21, 2017

前言

最近使用Python解析IDX文件格式的MNIST数据集,需要对二进制文件进行读取操作,其中我使用的是struct模块。查了网上挺多教程都写的挺好的,不过对新手不是很友好,所以我重新整理了一些笔记以供快速上手。

注:教程中以下四个名词同义:二进制流、二进制数组、字节流、字节数组

快速上手

在struct模块中,将一个整型数字、浮点型数字或字符流(字符数组)转换为字节流(字节数组)时,需要使用格式化字符串fmt告诉struct模块被转换的对象是什么类型,比如整型数字是'i',浮点型数字是'f',一个ascii码字符是's'。

def demo1():
 # 使用bin_buf = struct.pack(fmt, buf)将buf为二进制数组bin_buf
 # 使用buf = struct.unpack(fmt, bin_buf)将bin_buf二进制数组反转换回buf

 # 整型数 -> 二进制流
 buf1 = 256
 bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer'
 ret1 = struct.unpack('i', bin_buf1)
 print bin_buf1, ' <====> ', ret1

 # 浮点数 -> 二进制流
 buf2 = 3.1415
 bin_buf2 = struct.pack('d', buf2) # 'd'代表'double'
 ret2 = struct.unpack('d', bin_buf2)
 print bin_buf2, ' <====> ', ret2

 # 字符串 -> 二进制流
 buf3 = 'Hello World'
 bin_buf3 = struct.pack('11s', buf3) # '11s'代表长度为11的'string'字符数组
 ret3 = struct.unpack('11s', bin_buf3)
 print bin_buf3, ' <====> ', ret3

 # 结构体 -> 二进制流
 # 假设有一个结构体
 # struct header {
 # int buf1;
 # double buf2;
 # char buf3[11];
 # }
 bin_buf_all = struct.pack('id11s', buf1, buf2, buf3)
 ret_all = struct.unpack('id11s', bin_buf_all)
 print bin_buf_all, ' <====> ', ret_all

输出结果如下:

Python中struct模块对字节流/二进制流的操作教程
demo1输出结果

详解struct模块

主要函数

struct模块中最重要的三个函数是pack() , unpack() , calcsize()

# 按照给定的格式化字符串,把数据封装成字符串(实际上是类似于c结构体的字节流)
string = struct.pack(fmt, v1, v2, ...)

# 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple
tuple = unpack(fmt, string)

# 计算给定的格式(fmt)占用多少字节的内存
offset = calcsize(fmt)

struct中的格式化字符串

struct中支持的格式如下表:

Format C Type Python 字节数
x pad byte no value 1
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer or lon 4
l long integer 4
L unsigned long long 4
q long long long 8
Q unsigned long long long 8
f float float 4
d double float 8
s char[] string 1
p char[] string 1
P void * long  

      注1:q和Q只在机器支持64位操作时有意思

      注2:每个格式前可以有一个数字,表示个数

      注3:s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串

      注4:P用来转换一个指针,其长度和机器字长相关

      注5:最后一个可以用来表示指针类型的,占4个字节

为了同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 相关文章推荐
python&amp;MongoDB爬取图书馆借阅记录
Feb 05 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
python抓取京东小米8手机配置信息
Nov 13 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
python实现flappy bird小游戏
Dec 24 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
python之pexpect实现自动交互的例子
Jul 25 Python
Django之PopUp的具体实现方法
Aug 31 Python
Python爬虫实现模拟点击动态页面
Mar 05 Python
怎么快速自学python
Jun 22 Python
基于python实现音乐播放器代码实例
Jul 01 Python
python 字典和列表嵌套用法详解
Jun 29 Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 #Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
Jan 21 #Python
python实现的多线程端口扫描功能示例
Jan 21 #Python
Python 字符串大小写转换的简单实例
Jan 21 #Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 #Python
python dict 字典 以及 赋值 引用的一些实例(详解)
Jan 20 #Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
Jan 20 #Python
You might like
在JavaScript中调用php程序
2009/03/09 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
js arguments.callee的应用代码
2009/05/07 Javascript
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
2010/03/09 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
javascript最基本的函数汇总
2015/06/25 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
小程序实现悬浮搜索框
2019/07/12 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
JS实现手风琴特效
2020/11/08 Javascript
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
python实现网站的模拟登录
2016/01/04 Python
Python 描述符(Descriptor)入门
2016/11/20 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
linux 下selenium chrome使用详解
2020/04/02 Python
详解Python 循环嵌套
2020/07/09 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
世界上最大的折扣香水店:FragranceNet.com
2016/10/26 全球购物
尼克松手表官网:Nixon手表
2019/03/17 全球购物
Prototype如何更新局部页面
2013/03/03 面试题
超市总经理岗位职责
2014/02/02 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
大学生职业生涯规划书汇总
2014/03/20 职场文书
校庆口号
2014/06/20 职场文书
python保存图片的四个常用方法
2022/02/28 Python