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 django集成cas验证系统
Jul 14 Python
python判断字符串是否纯数字的方法
Nov 19 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
django 多数据库配置教程
May 30 Python
Sanic框架请求与响应实例分析
Jul 16 Python
python实现连续图文识别
Dec 18 Python
Python中的十大图像处理工具(小结)
Jun 10 Python
Python基础学习之函数方法实例详解
Jun 18 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
Aug 08 Python
python实现计算图形面积
Feb 22 Python
Python pandas求方差和标准差的方法实例
Aug 04 Python
一些让Python代码简洁的实用技巧总结
Aug 23 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详细彻底学习Smarty
2008/03/27 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
2018/05/02 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
Python松散正则表达式用法分析
2016/04/29 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
学生信息管理系统python版
2018/10/17 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
python实现感知机模型的示例
2020/09/30 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
物业管理公司实习生自我鉴定
2013/09/19 职场文书
销售总监工作职责
2013/11/21 职场文书
挑战杯创业计划书的写作指南
2014/01/07 职场文书
报社实习生自荐信
2014/01/24 职场文书
大学生旅游业创业计划书
2014/01/29 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
广播节目策划方案
2014/05/23 职场文书
节水标语大全
2014/06/11 职场文书
中学生打架检讨书
2014/10/13 职场文书
民事二审代理词
2015/05/25 职场文书