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创建声明性迷你语言的教程
Apr 13 Python
python通过openpyxl生成Excel文件的方法
May 12 Python
Python中的rjust()方法使用详解
May 19 Python
python实现在控制台输入密码不显示的方法
Jul 02 Python
Eclipse中Python开发环境搭建简单教程
Mar 23 Python
win10 64bit下python NLTK安装教程
Sep 19 Python
python批量获取html内body内容的实例
Jan 02 Python
python实战串口助手_解决8串口多个发送的问题
Jun 12 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
Python使用Paramiko控制liunx第三方库
May 20 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
Dec 03 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查询网站的PR值
2013/10/30 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
$.ajax json数据传递方法
2008/11/19 Javascript
jqPlot jquery的页面图表绘制工具
2009/07/25 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
Python中反射和描述器总结
2018/09/23 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
基于python3实现倒叙字符串
2020/02/18 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
python中判断文件结束符的具体方法
2020/08/04 Python
python 怎样进行内存管理
2020/11/10 Python
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
六一儿童节活动策划方案
2014/01/27 职场文书
授权委托书
2014/07/31 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
PHP中多字节字符串操作实例详解
2021/08/23 PHP
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技