前言

最近使用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
输出结果如下:
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
# struct
# 二进制
# python字节流
# 字节序
# Python 字节流
# 字符串
# 十六进制相互转换实例(binascii
# bytes)
# Python 二进制字节流数据的读取操作(bytes与bitstring)
# 按原
# 的是
# 浮点
# 整型
# 二进制数
# 长度为
# 放在
# 就像
# 第一个
# 最重要
# 可以用
# 不是很
# 只在
# 这篇文章
# 挺好
# 类似于
# 转换为
# 以供
# 可以用来
# 下表
相关文章:
如何在建站主机中优化服务器配置?
建站之星各版本价格是多少?
广州商城建站系统开发成本与周期如何控制?
学校为何禁止电信移动建设网站?
如何配置IIS站点权限与局域网访问?
如何快速搭建虚拟主机网站?新手必看指南
定制建站是什么?如何实现个性化需求?
jQuery 常见小例汇总
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
已有域名和空间如何快速搭建网站?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
高端智能建站公司优选:品牌定制与SEO优化一站式服务
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
香港服务器WordPress建站指南:SEO优化与高效部署策略
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何快速使用云服务器搭建个人网站?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
如何选购建站域名与空间?自助平台全解析
宝塔建站教程:一键部署配置流程与SEO优化实战指南
山东网站制作公司有哪些,山东大源集团官网?
如何在阿里云购买域名并搭建网站?
建站之星后台密码遗忘如何找回?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
ui设计制作网站有哪些,手机UI设计网址吗?
如何通过FTP服务器快速搭建网站?
SQL查询语句优化的实用方法总结
如何快速查询域名建站关键信息?
如何在万网主机上快速搭建网站?
大连网站设计制作招聘信息,大连投诉网站有哪些?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何获取开源自助建站系统免费下载链接?
如何在万网自助建站中设置域名及备案?
如何快速搭建二级域名独立网站?
如何选择服务器才能高效搭建专属网站?
建站之星云端配置指南:模板选择与SEO优化一键生成
简历在线制作网站免费,免费下载个人简历的网站是哪些?
建站之星上传入口如何快速找到?
江苏网站制作公司有哪些,江苏书法考级官方网站?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
制作网站公司那家好,网络公司是做什么的?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
家具网站制作软件,家具厂怎么跑业务?
详解jQuery停止动画——stop()方法的使用
音乐网站服务器如何优化API响应速度?
利用JavaScript实现拖拽改变元素大小
如何确保FTP站点访问权限与数据传输安全?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
*请认真填写需求信息,我们会在24小时内与您取得联系。