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中使用列表生成式的教程
Apr 27 Python
总结Python编程中三条常用的技巧
May 11 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
Jan 24 Python
使用Python搭建虚拟环境的配置方法
Feb 28 Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 Python
解决Python正则表达式匹配反斜杠''\''问题
Jul 17 Python
Python lambda表达式filter、map、reduce函数用法解析
Sep 11 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
python3 os进行嵌套操作的实例讲解
Nov 19 Python
使用python创建股票的时间序列可视化分析
Mar 03 Python
Python进程池与进程锁之语法学习
Apr 11 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 - Html Transfer Code
2006/10/09 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
2012/09/07 PHP
php事务处理实例详解
2014/07/11 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
PHP实现的操作数组类库定义与用法示例
2019/05/24 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
dwr spring的集成实现代码
2009/03/22 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
2012/12/11 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
jQuery实现本地存储
2020/12/22 jQuery
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
python中list列表的高级函数
2016/05/17 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
python交互模式基础知识点学习
2020/06/18 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
Django权限控制的使用
2021/01/07 Python
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
校园安全标语
2014/06/07 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
小学少先队活动总结
2015/05/08 职场文书
员工手册编写范本
2015/05/14 职场文书
从事会计工作年限证明
2015/06/23 职场文书
详解Redis瘦身指南
2021/05/26 Redis
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android