You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:30:04