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的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 Python
新手如何快速入门Python(菜鸟必看篇)
Jun 10 Python
Python批量合并有合并单元格的Excel文件详解
Apr 05 Python
python中join()方法介绍
Oct 11 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
Python 调用 Windows API COM 新法
Aug 22 Python
Python接口自动化判断元素原理解析
Feb 24 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
python 实现关联规则算法Apriori的示例
Sep 30 Python
pycharm中选中一个单词替换所有重复单词的实现方法
Nov 17 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
python实现MD5进行文件去重的示例代码
Jul 09 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 Curl出现403错误的解决办法
2014/05/29 PHP
php实现可逆加密的方法
2015/08/11 PHP
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
Javascript验证方法大全
2015/09/21 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
[00:35]可解锁地面特效
2018/12/20 DOTA
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
使用Python下载Bing图片(代码)
2013/11/07 Python
Python中文编码那些事
2014/06/25 Python
python基于windows平台锁定键盘输入的方法
2015/03/05 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
Python Pandas分组聚合的实现方法
2019/07/02 Python
详解python中eval函数的作用
2019/10/22 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
设置jupyter中DataFrame的显示限制方式
2020/04/12 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
Python中无限循环需要什么条件
2020/05/27 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
装修设计师求职信
2014/02/26 职场文书
实习护士自荐信
2014/06/21 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB