LabVIEW 类型描述符
🧩 一、确认背景
你说的“问题标签是ABCD又变成10”,意思大概是这样:
| 控件 | 数据类型 | 标签 | Type Descriptor 长度 | 
|---|---|---|---|
| Boolean | “AB” | 8 | |
| Boolean | “ABC” | 8 | |
| Boolean | “ABCD” | 10 | 
即:同样是一个 Boolean 控件,
只是标签名(Label)从 2 字符 → 4 字符,Type Descriptor 长度从 8 → 10。
🧠 二、关键点:这时你看到的不是纯类型描述符 (Type Descriptor),而是“Type + Label 组合结构”
LabVIEW 在某些序列化、Flatten 或控件引用结构(尤其是“控件属性列表”或“VI 文件内部结构”)里,会用如下格式保存一个控件:
也就是说:
- 
纯 Type Descriptor:固定 8 字节;
 - 
但如果后面带 Label(Pascal 字符串):
- 
Label 头 = 1字节长度;
 - 
Label 内容 = N字节;
 - 
所以总长度 = 8 + 1 + N。
 
 - 
 
🧮 三、举个例子
| Label | Pascal字符串形式 | Type Descriptor部分(8B) | 总长度 | 
|---|---|---|---|
| "AB" | 02 41 42 | 
01 00 00 00 00 00 00 00 | 
8 + 3 = 11 | 
| "ABC" | 03 41 42 43 | 
同上 | 8 + 4 = 12 | 
| "ABCD" | 04 41 42 43 44 | 
同上 | 8 + 5 = 13 | 
不过有时 LabVIEW 会在结构中压缩对齐(比如 2 字节对齐、偶数字节填充 0),
于是你看到的“显示长度”为:
- 
8(小于等于3字节Label)
 - 
10(4字节Label,有对齐补位)
 
也就是说:
当 Label 变成 "ABCD"(长度 4),系统加了 1字节长度前缀,再为了对齐补了 1字节填充,所以整体从 8 → 10。
⚙️ 四、为什么 LabVIEW 要补齐到偶数?
LabVIEW 在类型描述符、控件块中大量使用 16 位对齐 (word alignment)。
这是为了:
- 
不同平台(x86/x64/ARM)结构解析更快;
 - 
Flatten / Unflatten 更容易移植;
 - 
避免跨字节访问带来的 CPU Penalty。
 
所以:
- 
Label 长度为奇数 → 不补;
 - 
Label 长度为偶数 → 再补 1;
这样总长度始终是奇偶一致,结构整体保持对齐。 
🧩 五、总结表格
| Label | Label长度 | Pascal结构 | 说明 | 最终长度 | 
|---|---|---|---|---|
| AB | 2 | 02 41 42 | +1前缀,共3字节 | 8 + 3 = 11 (取对齐8) | 
| ABC | 3 | 03 41 42 43 | +1前缀,共4字节 | 8 + 4 = 12 (取对齐8) | 
| ABCD | 4 | 04 41 42 43 44 | +1前缀,共5字节,对齐补1 | 8 + 6 = 14(显示10) | 
不同版本的 LabVIEW、Flatten 方法、结构保存方式略有差异——有的计算Type Descriptor本体长度,有的计算整个块长度。
✅ 六、结论
| 现象 | 原因 | 
|---|---|
| 标签从 AB/ABC → ABCD 后,Type Descriptor 长度从 8 → 10 | 因为此时 LabVIEW 的类型块里附带了 标签的 Pascal 字符串 + 对齐字节 | 
| 类型是否变了 | ❌ 没有变,仍是 Boolean | 
| 为什么有补齐 | LabVIEW 内部用 16 位对齐保证跨平台结构一致性 | 
| 怎么验证 | 用 VI Scripting 读 TypeDesc 本体 vs 控件信息结构对比即可看出差异 | 
💡 一句话总结:
标签变长后,LabVIEW 会在类型描述结构后面附带 Pascal字符串存储标签名,并补齐到偶数字节边界,所以“ABCD”时长度从 8 变成 10,看起来变长,但数据类型本身没有变。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/955735.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!