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采集腾讯新闻实例
Jul 10 Python
Python入门篇之数字
Oct 20 Python
python自定义解析简单xml格式文件的方法
May 11 Python
Django 跨域请求处理的示例代码
May 02 Python
Python读写及备份oracle数据库操作示例
May 17 Python
Django框架ORM数据库操作实例详解
Nov 07 Python
python如何实现单链表的反转
Feb 10 Python
Python递归函数特点及原理解析
Mar 04 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
Apr 10 Python
Pycharm Git 设置方法
Sep 15 Python
python 获取计算机的网卡信息
Feb 18 Python
上帝为你开了一扇窗之Tkinter常用函数详解
Jun 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
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
ExtJS 入门
2010/10/29 Javascript
再论Javascript的类继承
2011/03/05 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
Vue $emit()不能触发父组件方法的原因及解决
2020/07/28 Javascript
python编写猜数字小游戏
2019/10/06 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
《和我们一样享受春天》教学反思
2014/02/07 职场文书
经理助理岗位职责
2014/03/05 职场文书
计算机网络专业求职信
2014/06/05 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
公司周年庆典标语
2014/10/07 职场文书
团代会邀请函
2015/02/02 职场文书
督导岗位职责
2015/02/04 职场文书
好好学习保证书
2015/02/26 职场文书
小学生班干部竞选稿
2015/11/20 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP
mysql全面解析json/数组
2022/07/07 MySQL