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实现示例
Aug 26 Python
各个系统下的Python解释器相关安装方法
Oct 12 Python
详解Python中的__getitem__方法与slice对象的切片操作
Jun 27 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
python和shell监控linux服务器的详细代码
Jun 22 Python
基于Python在MacOS上安装robotframework-ride
Dec 28 Python
Python函数参数匹配模型通用规则keyword-only参数详解
Jun 10 Python
Python表达式的优先级详解
Feb 18 Python
Python爬虫程序架构和运行流程原理解析
Mar 09 Python
Python爬取YY评级分数并保存数据实现过程解析
Jun 01 Python
python如何利用Mitmproxy抓包
Oct 10 Python
python基础学习之递归函数知识总结
May 26 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
Discuz! Passport 通行证整合
2008/03/27 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
toString()一个会自动调用的方法
2010/02/08 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
jQuery实现表格行上移下移和置顶的方法
2015/05/22 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
2016/10/28 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
[01:08]DOTA2“血战之命”预告片
2017/08/12 DOTA
用Python编写web API的教程
2015/04/30 Python
python机器学习理论与实战(一)K近邻法
2021/01/28 Python
python 接收处理外带的参数方法
2018/12/03 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
Python实现自动访问网页的例子
2020/02/21 Python
Python通过字典映射函数实现switch
2020/11/06 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
事业单位公务员的职业生涯规划
2014/01/15 职场文书
工程招投标邀请书
2014/01/26 职场文书
教学改革实施方案
2014/03/31 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
投标保密承诺书
2014/05/19 职场文书
售房委托书
2014/08/30 职场文书
学前班语言教学计划
2015/01/20 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
比较几种Redis集群方案
2021/06/21 Redis
浅谈JavaScript作用域
2021/12/06 Javascript