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 命令行非阻塞输入的小例子
Sep 27 Python
django框架如何集成celery进行开发
May 24 Python
python+ffmpeg视频并发直播压力测试
Mar 06 Python
Python3 replace()函数使用方法
Mar 19 Python
基于python 处理中文路径的终极解决方法
Apr 12 Python
python实现读取大文件并逐行写入另外一个文件
Apr 19 Python
python中dir()与__dict__属性的区别浅析
Dec 10 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
Aug 08 Python
使用Python-OpenCV消除图像中孤立的小区域操作
Jul 05 Python
Python实现扫码工具的示例代码
Oct 09 Python
python利用faker库批量生成测试数据
Oct 15 Python
python 装饰器重要在哪
Feb 14 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
我的群发邮件程序
2006/10/09 PHP
php &amp;&amp; 逻辑与运算符使用说明
2010/03/04 PHP
php cookie的操作实现代码(登录)
2010/12/29 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
thinkphp中memcache的用法实例
2014/11/29 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
2015/12/31 PHP
使用php+swoole对client数据实时更新(一)
2016/01/07 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
2016/10/08 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
python中执行shell命令的几个方法小结
2014/09/18 Python
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
python 获取图片分辨率的方法
2019/01/08 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
Python如何批量生成和调用变量
2020/11/21 Python
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
质量承诺书格式
2014/05/20 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
军人离婚协议书样本
2014/10/21 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
教师节老师寄语
2015/05/28 职场文书
教师年度考核自我评鉴
2015/08/11 职场文书
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers