python二进制文件的转译详解


Posted in Python onJuly 03, 2019

首先导入所需的包:import struct

struct有以下几个主要的函数:

# 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流)
pack(fmt, v1, v2, ...)
# 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple
unpack(fmt, string) 
# 计算给定的格式(fmt)占用多少字节的内存
calcsize(fmt)

例如:我需要读取一个名为filename,存放着形状为[100,1025]的浮点数的文件。可以采用以下办法

import numpy as np
import struct 
# 加载测试数据
f = open('filename','rb')
# 102500为文档中包含的数字个数,而一个浮点数占4个字节
data_raw = struct.unpack('f'*102500,f.read(4*102500))
f.close()
verify_data = np.asarray(verify_data_raw).reshape(-1,1025)

同理如果想转把二进制转成double型:

import numpy as np
import struct
f = open('data8.dat','rb')
d_str = f.read()
f.close()
d_len = len(d_str)
d_len2 = d_len//8
#有时还需考虑字节顺序,如为big-endian,则以上语句改为 data = struct.unpack('>'+str(d_len/4)+'f',d_str)
data = struct.unpack(d_len2*'d',d_str)

注意:fmt前的数字必须为int型,即int*'d' 否则会报‘can't multiply sequence by non-int of type 'float'' 的错误

具体函数细节请查询  struct官方文档

下面提供了了fmt表示方法

FORMAT PYTHON TYPE STANDARD SIZE
x no value
c string of length 1 1
b integer 1
B integer 1
? bool 1
h integer 2
H integer 2
i integer 4
I integer 4
l integer 4
L integer 4
q integer 8
Q integer 8
f float 4
d float 8
s string
p string
P integer

为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:

CHARACTER BYTE ORDER SIZE ALIGNMENT
@ native native native
= native standard none
little-endian standard none
> big-endian standard none
! network (= big-endian) standard none

< : Little-Endian就是低位字节排放在内存的低地址端(栈顶),高位字节排放在内存的高地址端(栈底)

>:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

!: 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python查找第k小元素代码分享
Dec 18 Python
跟老齐学Python之传说中的函数编写条规
Oct 11 Python
Python函数可变参数定义及其参数传递方式实例详解
May 25 Python
RC4文件加密的python实现方法
Jun 30 Python
Swift中的协议(protocol)学习教程
Jul 08 Python
Python利用BeautifulSoup解析Html的方法示例
Jul 30 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
Python日志无延迟实时写入的示例
Jul 11 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
Jan 18 Python
pygame实现弹球游戏
Apr 14 Python
Python Django中间件使用原理及流程分析
Jun 13 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
Jul 03 #Python
深入浅析python3中的unicode和bytes问题
Jul 03 #Python
10款最好的Python开发编辑器
Jul 03 #Python
python基于递归解决背包问题详解
Jul 03 #Python
Python跳出多重循环的方法示例
Jul 03 #Python
Python多版本开发环境管理工具介绍
Jul 03 #Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 #Python
You might like
php计算十二星座的函数代码
2012/08/21 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
[04:52]DOTA2亚洲邀请赛附加赛 TOP10精彩集锦
2015/01/29 DOTA
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
python简单获取数组元素个数的方法
2015/07/13 Python
Python中几种属性访问的区别与用法详解
2018/10/10 Python
用Python进行websocket接口测试
2020/10/16 Python
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
蛋白质世界:Protein World
2017/11/23 全球购物
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
英国办公家具网站:Furniture At Work
2019/10/07 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
大四毕业生学习总结的自我评价
2013/10/31 职场文书
文字自荐书范文
2014/02/10 职场文书
数控技术学生的自我评价
2014/02/15 职场文书
大学生2014全国两会学习心得体会
2014/03/10 职场文书
安全生产专项整治方案
2014/05/06 职场文书
初中家长评语和期望
2014/12/26 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书