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脚本
Apr 05 Python
python3 与python2 异常处理的区别与联系
Jun 19 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
python实现简易云音乐播放器
Jan 04 Python
Python实现读取Properties配置文件的方法
Mar 29 Python
Python类中self参数用法详解
Feb 13 Python
Python自动化办公Excel模块openpyxl原理及用法解析
Nov 05 Python
Alpine安装Python3依赖出现的问题及解决方法
Dec 25 Python
python中str内置函数用法总结
Dec 27 Python
matplotlib交互式数据光标实现(mplcursors)
Jan 13 Python
Python基础之进程详解
May 21 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
PHP 数组教程 定义数组
2009/10/23 PHP
php计算title标题相似比的方法
2015/07/29 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
javascript类继承机制的原理分析
2009/09/12 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
Javascript 按位与运算符 (&amp;)使用介绍
2014/02/04 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
pace.js和NProgress.js两个加载进度插件的一点小总结
2018/01/31 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
利用django如何解析用户上传的excel文件
2017/07/24 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
python学生信息管理系统(完整版)
2020/04/05 Python
Python 正则表达式爬虫使用案例解析
2019/09/23 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
Python如何安装第三方模块
2020/05/28 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
html5中的一些标签学习(心得)
2016/10/18 HTML / CSS
Python中如何定义一个函数
2016/09/06 面试题
高三自我鉴定
2013/10/23 职场文书
毕业生护理专业个人求职信范文
2014/01/04 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
2014年法务工作总结
2014/12/11 职场文书
高中生综合素质评价范文
2015/08/18 职场文书
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS
Python基础之数据类型知识汇总
2021/05/18 Python
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫