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实现strcmp函数功能示例
Mar 25 Python
Python使用Scrapy爬取妹子图
May 28 Python
Python的collections模块中namedtuple结构使用示例
Jul 07 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
Python实现批量压缩图片
Jan 25 Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 Python
Python SMTP发送邮件遇到的一些问题及解决办法
Oct 24 Python
python批量修改xml属性的实现方式
Mar 05 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
详解Python直接赋值,深拷贝和浅拷贝
Jul 09 Python
Python运算符+与+=的方法实例
Feb 18 Python
详解Python 中的 defaultdict 数据类型
Feb 22 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中使用Oracle数据库(4)
2006/10/09 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
php关闭warning问题的解决方法
2016/05/17 PHP
PHP 图片合成、仿微信群头像的方法示例
2019/10/25 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
如何使用JS在HTML中自定义字符串格式化
2017/07/20 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
VsCode里的Vue模板的实现
2020/08/12 Javascript
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
python+matplotlib绘制饼图散点图实例代码
2018/01/20 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
村官学习十八大感想
2014/01/15 职场文书
关键在于落实心得体会
2014/09/03 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
步步惊心观后感
2015/06/12 职场文书
秋季运动会加油词
2015/07/18 职场文书
给学校的建议书400字
2015/09/14 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android
JVM钩子函数的使用场景详解
2021/08/23 Java/Android
Elasticsearch 聚合查询和排序
2022/04/19 Python
Nginx报404错误的详细解决方法
2022/07/23 Servers