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 相关文章推荐
Pyramid添加Middleware的方法实例
Nov 27 Python
Django 实现下载文件功能的示例
Mar 06 Python
django 解决manage.py migrate无效的问题
May 27 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
opencv之为图像添加边界的方法示例
Dec 26 Python
python垃圾回收机制(GC)原理解析
Dec 30 Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 Python
django Model层常用验证器及自定义验证器详解
Jul 15 Python
python 自动识别并连接串口的实现
Jan 19 Python
一篇文章带你搞懂Python类的相关知识
May 20 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 归并排序 数组交集
2011/05/10 PHP
PHP实现一维数组转二维数组的方法
2015/02/25 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
Js面试算法详解
2018/04/08 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
JavaScript实现放大镜效果代码示例
2020/04/29 Javascript
js实现带积分弹球小游戏
2020/07/21 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
python匿名函数用法实例分析
2019/08/03 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
flask框架中的cookie和session使用
2021/01/31 Python
Python 图片处理库exifread详解
2021/02/25 Python
CSS3中的@keyframes关键帧动画的选择器绑定
2016/06/13 HTML / CSS
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
IWOOT美国:新奇的小玩意
2018/04/27 全球购物
婚前协议书范本两则
2014/10/16 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
单位未婚证明范本
2014/11/25 职场文书
小学教师节活动总结
2015/03/20 职场文书
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫
win sever 2022如何占用操作主机角色
2022/06/25 Servers
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers