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中的格式化输出用法总结
Jul 28 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
Python实现获取磁盘剩余空间的2种方法
Jun 07 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
python 猴子补丁(monkey patch)
Jun 26 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
浅析Python中字符串的intern机制
Oct 03 Python
python里glob模块知识点总结
Jan 05 Python
python plt.plot bar 如何设置绘图尺寸大小
Jun 01 Python
如何Python使用re模块实现okenizer
Apr 30 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
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
不用ajax实现点击文字即可编辑的方法
2007/12/16 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
vue小白入门教程
2018/04/02 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
Python中模块string.py详解
2017/03/12 Python
初学python的操作难点总结(新手必看篇)
2017/08/03 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
django使用admin站点上传图片的实例
2019/07/28 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
Python如何转换字符串大小写
2020/06/04 Python
澳洲健康食品网上商店:Aussie Health Products
2018/06/15 全球购物
感恩母亲节活动方案
2014/03/04 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
新闻发布会主持词
2014/03/28 职场文书
创先争优公开承诺书
2014/08/30 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
街道社区活动报告
2015/02/05 职场文书
继续教育个人总结
2015/03/03 职场文书
学生早退检讨书(范文)
2019/08/19 职场文书