工作中遇到读取二进制文件内参数的任务,经过查找和总结,发现以下可行方法:

方法一

使用numpy中fromfile方法对二进制文件进行定向读取。

magic = numpy.fromfile(file,dtype='>u2',count=3,sep="",offset=3916536)

file:所要读取的二进制文件
dtype:读取二进制文件的设置,‘>u2’中‘>’代表大端读取,即正序读取;u代表无符号整数‘’;2代表读取两个字节,即读取数为8位无符号整数
count:是所要读取数的数量
sep:代表读取之间的间隔,读取二进制文件默认为 “”
offset:为读取文件开始的指针指向的文件字节数。

参考如下:
10676 怎样暴力读取二进制数据文件
numpy fromfile 官方文档

方法二

由于方法一每次提取文件中的信息,都会对文件进行一次读取,想要提取多个信息,就会增加对文件的访问次数。为了减少文件的访问次数、采用指定的编码格式解码,使用IO流的方式读取文件信息,利用指定编码格式对信息解码:

import struct
f = open(file,'rb+')#'rb+'中r为对文件只读,b为将文件视为二进制文件
bytestring = f.read(4)#所要读取的信息为4字节Int
magic = struct.unpack("i",bytestring)

bytestring的内容为b’\n\n\xfe\xfe’,使用struct.unpack方法解码。
其中fmt字符串“i”代表int,最终magic解码结果为-16905718,符合预期。
参考如下:
Python中struct.pack()和struct.unpack()用法详细说明
,每个数据的类型的fmt在其中。

对于指定位置的二进制文件流信息,使用python文件的seek()方法指定二进制文件流的位置:

f.seek(20)#从第21个字节开始读取4字节的整型变量
byt = f.read(4)
nofblock = struct.unpack("i",byt)[0]
print(nofblock)

更多推荐

使用Python读取二进制文件内的信息