最近使用python读取了一个二进制文件,方法分享如下:
如对应c++存储了如下变量:
char a[512];
unsigned char b;
unsigned char c;
uint32_t d;
....
如在某二进制文件中存储了上述格式的数据,分别是512个char的变量a,unsigned char的b和c,uint32_t 的的d。
如果我们要读取unsigned char的b和c,uint32_t 的的d,
可以使用:
这里读取后的数据格式为:<class ‘_io.BufferedReader’>
from io import BufferedReader
import numpy as np
def loadDataSet(fileName):
with open(fileName,'rb')as fr:
fr.seek(512)
print(np.frombuffer(fr.read(1), dtype=np.uint8))
print(np.frombuffer(fr.read(1), dtype=np.uint8))
print(np.frombuffer(fr.read(4), dtype=np.uint32))
...
if __name__=='__main__':
##读取数据
dataMat=np.array(loadDataSet(".\***"))
需要特别留意的是:
二进制格式:b’\x00\x01\x05\x02’
\x00,\x01这些代表2个16进制数,即一个8位数char。
否则就会出错。
另外读取一个32位数,需要使用 dtype=np.uint32 :
np.frombuffer(fr.read(4), dtype=np.uint32)
例:
np.frombuffer(b'M|\x23\x17', dtype=np.uint32)
#array([388201549], dtype=uint32)
但是数据类似于b’M|的存储格式,还没有搞清楚,后续再补充~
另外也可以使用:
from io import BufferedReader
import numpy as np
def loadDataSet(fileName):
with open(fileName,'rb')as fr:
a_buff = BufferedReader(fr)
a_byte = BufferedReader.read(a_buff )
arr = np.frombuffer(a_byte , dtype=np.uint8)
print(arr[512:])
....
这里统一设置成了np.uint8格式,使用时需要再进一步处理下。