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自动生成文章
Dec 25 Python
Python and、or以及and-or语法总结
Apr 14 Python
python简单猜数游戏实例
Jul 09 Python
Python基础篇之初识Python必看攻略
Jun 23 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
Python中的单继承与多继承实例分析
May 10 Python
python3中的md5加密实例
May 29 Python
10分钟教你用Python实现微信自动回复功能
Nov 28 Python
Python对象转换为json的方法步骤
Apr 25 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
python将excel转换为csv的代码方法总结
Jul 03 Python
python高阶函数map()和reduce()实例解析
Mar 16 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 adodb连接不同数据库
2009/03/19 PHP
php将html转成wml的WAP标记语言实例
2015/07/08 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
PHP 断点续传实例详解
2017/11/11 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
Javascript面向对象之四 继承
2011/02/08 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
Python Http请求json解析库用法解析
2020/11/28 Python
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
expedia比利时:预订航班+酒店并省钱
2018/07/13 全球购物
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
英国在线泳装店:Simply Swim
2019/05/05 全球购物
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
期末总结的个人自我评价
2013/11/02 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
导游词怎么写
2015/02/04 职场文书
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
Go 内联优化让程序员爱不释手
2022/06/21 Golang