使用Python Numpy从uint16类型raw dump数组中提取多类型数据方法
从uint16类型numpy数组提取多类型二进制数据的方案
前提:你已经通过rawData = numpy.fromfile(filename, dtype=np.uint16)将整个raw dump文件读取为元素类型为uint16的numpy数组,且明确知道data1、data2、data3在数组中的起始下标(下标从0开始计数,单位为uint16元素个数)。
核心方法说明
利用numpy的view()方法做内存重解释,不需要额外拷贝数据就可以将连续的uint16片段转换为目标类型,性能开销极低。如果文件字节序和当前运行环境字节序不匹配,转换后调用byteswap()方法调整字节顺序即可。
各数据提取实现
1. 提取uint64类型的data1
uint64占8字节,对应4个uint16元素,假设起始下标为start_idx1:
# 截取对应长度的片段,重解释为uint64类型 data1 = rawData[start_idx1 : start_idx1 + 4].view(np.uint64)[0] # 按需调整字节序的写法:data1 = rawData[start_idx1 : start_idx1 +4].view(np.uint64).byteswap()[0] # 打印uint64格式的data1 print(f"data1(uint64): {data1}")
2. 提取float类型的data2
如果是32位单精度float,占4字节对应2个uint16元素;如果是64位双精度float,占8字节对应4个uint16元素,假设起始下标为start_idx2,以32位float为例:
# 重解释为float32类型 data2 = rawData[start_idx2 : start_idx2 + 2].view(np.float32)[0] # 64位float写法:data2 = rawData[start_idx2 : start_idx2 +4].view(np.float64)[0] # 按需加byteswap()调整字节序 # 打印float格式的data2 print(f"data2(float): {data2}")
3. 提取自定义结构体类型的data3
首先定义和你的结构体匹配的numpy复合dtype,你描述的结构体包含1个uint32成员、长度为5的float数组,总大小为4 + 5*4 = 24字节,对应12个uint16元素,假设起始下标为start_idx3:
# 定义结构体dtype,如果需要匹配C语言结构体对齐规则,可加align=True参数 struct_dtype = np.dtype([ ("uint32_member", np.uint32), ("float_array", np.float32, 5) ]) # 重解释为结构体类型 data3 = rawData[start_idx3 : start_idx3 + 12].view(struct_dtype)[0] # 访问结构体成员示例 uint32_val = data3["uint32_member"] float_arr = data3["float_array"]
注意事项
- 请根据你实际的二进制布局调整起始下标和目标类型长度,避免越界访问
- 如果要批量处理连续重复的多组数据,可以直接将整个rawData转换为复合dtype的数组,不需要逐段切片
- 结构体如果存在字节填充(对齐)的情况,定义dtype时需要对应添加填充位或者开启align参数
内容的提问来源于stack exchange,提问作者Raghu
相关产品推荐
相关产品推荐

