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找出list中最常出现元素的方法
Jun 14 Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
Python切片操作深入详解
Jul 27 Python
python 使用sys.stdin和fileinput读入标准输入的方法
Oct 17 Python
Python在OpenCV里实现极坐标变换功能
Sep 02 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
适合Python初学者的一些编程技巧
Feb 12 Python
Python 实现敏感目录扫描的示例代码
May 21 Python
详细分析Python垃圾回收机制
Jul 01 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作的文本留言本的例子(四)
2006/10/09 PHP
PHP中的integer类型使用分析
2010/07/27 PHP
php _autoload自动加载类与机制分析
2012/02/10 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
JS小框架 fly javascript framework
2009/11/26 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
Angularjs的ng-repeat中去除重复数据的方法
2016/08/05 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
深入探究node之Transform
2017/07/20 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
python:socket传输大文件示例
2017/01/18 Python
Python实现的栈(Stack)
2018/01/26 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
用python对oracle进行简单性能测试
2020/12/05 Python
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
会计毕业生求职简历的自我评价
2013/10/20 职场文书
校运会入场式解说词
2014/02/10 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
通知格式
2015/04/27 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python
如何利用Python实现一个论文降重工具
2021/07/09 Python
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL