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 07 Python
python僵尸进程产生的原因
Jul 21 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
Dec 12 Python
Python实现PS滤镜功能之波浪特效示例
Jan 26 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
Oct 31 Python
python开发游戏的前期准备
May 05 Python
基于YUV 数据格式详解及python实现方式
Dec 09 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
如何给Python代码进行加密
Jan 10 Python
Python爬虫中Selenium实现文件上传
Dec 04 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入门源程序
2006/10/09 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
php之可变函数的实例详解
2017/09/13 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
js同时按下两个方向键
2007/12/01 Javascript
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
详解python如何引用包package
2020/06/07 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
《梅兰芳学艺》教学反思
2014/02/24 职场文书
伊索寓言教学反思
2014/05/01 职场文书
公司周年庆典策划方案
2014/05/17 职场文书
汽车广告策划方案
2014/05/31 职场文书
财务工作失误检讨书
2015/02/19 职场文书
学校运动会加油词
2015/07/18 职场文书
小学三年级班主任工作经验交流材料
2015/11/02 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书