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通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
python如何通过twisted实现数据库异步插入
Mar 20 Python
python+pandas分析nginx日志的实例
Apr 28 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
Scrapy使用的基本流程与实例讲解
Oct 21 Python
Python3 max()函数基础用法
Feb 19 Python
Python numpy线性代数用法实例解析
Nov 15 Python
python 等差数列末项计算方式
May 03 Python
Python连接Impala实现步骤解析
Aug 04 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 Python
python实现自动化群控的步骤
Apr 11 Python
python中 Flask Web 表单的使用方法
May 20 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中变量及部分适用方法
2008/03/27 PHP
PHP 裁剪图片成固定大小代码方法
2009/09/09 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
基于jquery实现的鼠标拖拽元素复制并写入效果
2011/08/23 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
在vue-cli中组件通信的方法
2017/12/16 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
小程序点击图片实现png转jpg
2019/10/22 Javascript
react基本安装与测试示例
2020/04/27 Javascript
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
Django Form常用功能及代码示例
2020/10/13 Python
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
办公文员的工作岗位职责
2013/11/12 职场文书
妇女干部培训方案
2014/05/12 职场文书
保护环境倡议书范文
2014/05/13 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python