我有一个二进制文件,其记录结构为400 24位有符号大端整数,后跟16位大端符号短路.我想要做的是:
from numpy import dtype , fromfile
record_dtype = dtype([('samples','>i3',(400,)),('marker','>i2')])
data = fromfile('binary_file.dat',dtype=record_dtype)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我得到的是:
TypeError: data type not understood
Run Code Online (Sandbox Code Playgroud)
回应'> i3'.如何定义dtype以24位二进制数读取?
我有大约一个太字节文件,它是24位四通道PCM.
我当然不想触及除了我想要的任何部分,所以我做的是这样的:
import numpy as np
from numpy.lib.stride_tricks import as_strided
rawdatamap = np.memmap('4ch24bit800GBdatafile.pcm', dtype=np.dtype('u1'),mode='r')
# in case of a truncated frame at the end
usablebytes = rawdatamap.shape[0]-rawdatamap.shape[0]%12
frames = int(usablebytes/12)
rawbytes = rawdatamap[:usablebytes]
realdata = as_strided(rawbytes.view(np.int32), strides=(12,3,), shape=(frames,4))
someusefulpart = realdata[hugeoffset:hugeoffset+smallerthanram]&0x00ffffff
Run Code Online (Sandbox Code Playgroud)
这从文件中复制了smallerthanram一段内存长度的字节.
注意字节掩码!你需要它来切断32位字的最重要的字节 - 这将是属于前一个样本的垃圾.
您也可以将它应用于单个数据,如下所示:
scaled_ch2_datum_at_framenum = scalefactor*(realdata[framenum,1]&0x00ffffff)-shiftoffset
Run Code Online (Sandbox Code Playgroud)
它有点乱,但现在好了.
实际上你可能需要64位系统才能做到这一点.
NB.这适用于小端数据.要处理大端,你需要在视图中使用big-endian dtype,并替换...&0x00ffffff为...&ffffff00>>8