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过滤字符串中不属于指定集合中字符的类实例
Jun 30 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
python操作excel文件并输出txt文件的实例
Jul 10 Python
Django跨域请求CSRF的方法示例
Nov 11 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 Python
Python无头爬虫下载文件的实现
Apr 02 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
提高python代码运行效率的一些建议
Sep 29 Python
Python3获取cookie常用三种方案
Oct 05 Python
PyTorch dropout设置训练和测试模式的实现
May 27 Python
如何利用opencv判断两张图片是否相同详解
Jul 07 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实现粘贴截图并完成上传功能
2015/05/17 PHP
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
javascript时区函数介绍
2012/09/14 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
Bootstrap Table从零开始
2017/06/30 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
node.js中npm包管理工具用法分析
2020/02/14 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
对python3 urllib包与http包的使用详解
2018/05/10 Python
Python中遍历列表的方法总结
2019/06/27 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Python包,__init__.py功能与用法分析
2020/01/07 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
护理专业应届毕业生推荐信
2013/11/15 职场文书
教师年度考核自我鉴定
2014/01/19 职场文书
临床护士自荐信
2014/01/31 职场文书
暑期社会实践感言
2014/02/25 职场文书
新学期主题班会
2015/08/17 职场文书
Python基础之hashlib模块详解
2021/05/06 Python
深入浅析React中diff算法
2021/05/19 Javascript
浅谈MySQL之select优化方案
2021/08/07 MySQL
Java版 简易五子棋小游戏
2022/05/04 Java/Android