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 相关文章推荐
用map函数来完成Python并行任务的简单示例
Apr 02 Python
Python中循环引用(import)失败的解决方法
Apr 22 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
用TensorFlow实现lasso回归和岭回归算法的示例
May 02 Python
使用numpy和PIL进行简单的图像处理方法
Jul 02 Python
利用Python实现原创工具的Logo与Help
Dec 03 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
在python中将list分段并保存为array类型的方法
Jul 15 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 Python
django配置app中的静态文件步骤
Mar 27 Python
Python使用OpenPyXL处理Excel表格
Jul 02 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
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
php文件下载处理方法分析
2015/04/22 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
JQuery toggle使用分析
2009/11/16 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python语音识别实践之百度语音API
2018/08/30 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
Python编写万花尺图案实例
2021/01/03 Python
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
初中生学习的自我评价
2013/11/14 职场文书
大学生文员专业个人求职信范文
2014/01/05 职场文书
学术会议通知范文
2015/04/15 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
升学宴家长答谢词
2015/09/29 职场文书
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
Golang中channel的原理解读(推荐)
2021/10/16 Golang
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server
git中cherry-pick命令的使用教程
2022/06/25 Servers