如何使用Python读取TDMS文件中LabVIEW扁平化存储的双精度数组
读取LabVIEW压平后存储在TDMS中的双精度数组方案
1. 解析前置维度头信息
LabVIEW的Flatten to String VI默认输出的数组压平字节流遵循固定头结构:
- 开头前4字节为大端序有符号整数,代表数组的维度总数n
- 后续紧跟n个连续的4字节大端序有符号整数,依次对应每个维度的元素长度
- 维度头总长度为
4*(n+1)字节,头之后才是实际的数组数值字节流
举个实际例子:2维5行10列的双精度数组,维度头为 0x00000002(维度数2) + 0x00000005(第一维长度5) + 0x0000000A(第二维长度10),总长度12字节。
2. 大小端格式适配
LabVIEW默认的压平字节序为大端(Motorola格式),和x86/x64平台默认的小端(Intel格式)不兼容,需要针对性处理:
- 维度头的所有整数、后续的双精度浮点数,默认都按大端序存储
- 如果读取时出现数值量级异常(比如出现
1e+300这类不符合业务逻辑的数值),优先排查字节序是否匹配 - 若LabVIEW压平时手动设置了小端输出,所有字节序解析规则对应调整为小端即可
3. 完整读取流程(Python示例)
假设你已经从TDMS文件中读取到存储的原始字节数组raw_bytes,可按以下逻辑解析:
import struct import numpy as np # 读取维度数量(4字节大端整数) dim_count = struct.unpack(">i", raw_bytes[:4])[0] # 读取各维度长度 dim_sizes = struct.unpack(f">{dim_count}i", raw_bytes[4: 4 + 4 * dim_count]) # 计算数据区起始偏移和总元素数 header_total_len = 4 * (dim_count + 1) total_ele_count = 1 for size in dim_sizes: total_ele_count *= size # 读取所有双精度数值(大端格式) value_list = struct.unpack(f">{total_ele_count}d", raw_bytes[header_total_len: header_total_len + total_ele_count * 8]) # 重塑为对应维度的数组 result_array = np.array(value_list).reshape(dim_sizes)
注意事项
- 如果LabVIEW中使用
Flatten to String时手动关闭了「prepend array or string size?」选项,输出的字节流没有维度头,直接从偏移0开始读取双精度数值即可 - 不需要额外处理TDMS本身的字节序,我们解析的是TDMS中存储的自定义字节流内容,和TDMS容器本身的格式无关
内容的提问来源于stack exchange,提问作者user15420598
相关产品推荐
相关产品推荐

