类型描述符
- 更新时间2025-08-27
- 阅读时长15分钟
LabVIEW程序框图上每个连线和接线端都有其数据类型。LabVIEW通过内存中一种称为类型描述符的结构来跟踪这些数据类型。类型描述符是一个32位二进制整数序列,可描述LabVIEW中任何数据类型。如无特别说明,所有的数值均为16进制格式。
一个类型可以是聚合的,即一个类型可由多个不同类型组成。例如,在一个布尔数组中,数组是一个类型,而数组中的布尔型元素是另一个类型。在LabVIEW中,所有此中复杂类型的类型描述符都保存在一个列表中。
可观察的格式
您可使用平化至字符串函数或变体至平化字符串转换函数来观察不同格式的类型描述符。
如使用“平化至字符串”函数平化变体数据,LabVIEW将平化变体及其所有内容,包括其属性。使用该函数时,类型描述符保存缓冲区具有以下格式:
| 32位 | nTDs TDs |
| var size | nTypesUsed |
| var size | TypesUsed |
| 其中 nTDs | 是缓冲区中包含的类型描述符的数量 |
| TDs | 是nTDs类型描述符的列表 |
| var size | 是变量大小,以16位或32位存储在变量号中,具体取决于值的表示法。如值小于32768,则变量的大小字段为2个字节。如值大于等于32768,则变量的大小字段为4个字节,其最高位设定为1。 |
| nTypesUsed | 是通过引用缓冲区而正在使用中的类型描述符的实际数量 |
| TypesUsed | 是正在使用中的各类型TDs的索引列表 |
使用“平化至字符串”函数时,LabVIEW将只平化变体,丢弃所有属性。使用该函数时,类型描述符具有以下格式:
[大小][类型代码][类型特定信息][名称 (如适用)]
| 其中 [大小] | 是第一个字,以字节为单位,包含大小字。[大小]的最小值为4。您可向任何类型描述符附加一个名称(Pascal字符串),这时[大小]值将增加该名称的长度(且长度向上舍入为2的倍数)。大小为16位。 |
| [类型代码] | 是第二个字。LabVIEW保留类型代码的高位字节供内部使用。比较两个类型描述符是否等值时,应忽略该字节。即使其类型代码的高位字节不同,两个类型描述符也为等值。类型代码为16位。 |
| [类型特定信息] | 是关于类型描述符的附加信息。由于数组和簇中包含了其他数据类型的引用,因此它们是结构化的数据类型或数据类型的聚合。例如,簇类型还包含有关其中每个元素的类型的其他信息。 |
| [名称] | 是一个Pascal字符串。名称可有可无。 |
类型代码对实际类型信息进行编码,如单精度或扩展精度浮点数,如下表所示。这些类型代码值可能会在以后版本的LabVIEW中更改。
数据类型
下表列出了数值和非数值数据类型、类型代码和类型描述符。[大小]的最小值出现在类型代码之前。对于某些数据类型,关于[类型特定信息]的可能值的信息出现在类型代码之后。
| 注:名称可以加到任何类型描述符之后。名称是一个Pascal字符串。 |
| 数据类型 | 类型描述符(16进制数) |
|---|---|
| 8位整数 | 0004 xx 01 |
| 16位整数 | 0004 xx 02 |
| 32位整数 | 0004 xx 03 |
| 64位整数 | 0004 xx 04 |
| 无符号8位整型 | 0004 xx 05 |
| 无符号16位整型 | 0004 xx 06 |
| 无符号32位整型 | 0004 xx 07 |
| 无符号64位整型 | 0004 xx 08 |
| 单精度浮点数 | 0004 xx 09 |
| 双精度浮点数 | 0004 xx 0A |
| 扩展精度浮点数 | 0004 xx 0B |
| 单精度浮点复数 | 0004 xx 0C |
| 双精度浮点复数 | 0004 xx 0D |
| 扩展精度浮点复数 | 0004 xx 0E |
| 枚举8位二进制整数 | <nn> xx 15 <k><k pstrs> |
| 枚举16位二进制整数 | <nn> xx 16 <k><k pstrs> |
| 枚举32位二进制整数 | <nn> xx 17 <k><k pstrs> |
| 单精度物理量 | <nn> xx 19 <k><k base-exp> |
| 双精度物理量 | <nn> xx 1A <k><k base-exp> |
| 扩展精度物理量 | <nn> xx 1B <k><k base-exp> |
| 单精度复数物理量 | <nn> xx 1C <k><k base-exp> |
| 双精度复数物理量 | <nn> xx 1D <k><k base-exp> |
| 扩展精度复数物理量 | <nn> xx 1E <k><k base-exp> |
| 布尔 | 0004 xx 21 |
| 字符串 | 0008 xx 30 <dim> |
| 路径 | 0008 xx 32 <dim> |
| 图片 | 0008 xx 33 <dim> |
| 数组 | <Nn> xx 40 <k dims><元素类型描述符> |
| 簇 | <Nn> xx 50 <k elems><元素类型描述符> |
| 波形 | <Nn> xx 54 <波形类型><元素类型描述符> |
| 引用句柄 | <nn> <引用句柄类型代码> |
| Variant;变体 | <Nn> xx 53 |
| nn = 长度; xx = 被LabVIEW保留; k = 数; k pstrs = Pascal字符串数; k base-exp = 底数-指数对个数; k dims = 维数; k elems = 元素数; dim 是32位整数。 |
类型描述符长度的最小值为4,如上表所示。但是,任何类型描述符可附加一个名称(Pascal字符串),这时类型描述符的长度将包括该名称的长度(作为Pascal字符串),长度向上舍入为2的倍数。
枚举8位二进制整数
下例为一个枚举型8位整数,am、fm、fm stereo没有名称,每组字符表示一个十六进制的16位字。
0016 0015 0003 0261 6D02 666D 0966 6D20 7374 6572 656F
类型描述符包含以下字:
- 0016 - 表示共有22个字节
- 0015 - 表示枚举8位整数的类型代码
- 0003 - 代表共有3组枚举值
- 0261 6D02 666D 0966 6D20 7374 6572 656F - 表示类型代码的具体信息。例如,0261 6D是am的ASCII编码,02前缀表示字符串的大小(十六进制)。
如果同样一个枚举型8位整数的名称为radio,其类型描述符解析为:
001C 4015 0003 0261 6D02 666D 0966 6D20 7374 6572 656F 0572 6164 696F
下面是两个类型描述符的比较:
| | |
| | 不同长度 |
| | 相同的类型代码 |
| | 相同的枚举值表示 |
| | 名称,Pascal字符串radio |
物理量
下例为一个双精度物理量“米/秒”,每组字符代表一个16位二进制的字。
000E 001A 0002 0002 FFFF 0003 0001
类型描述符包含以下字:
- 000E - 表示共有14个字节
- 001A - 表示双精度物理量的类型代码
- 0002 - 表示两个底数-指数对
- 0002 - 为秒的基本单位索引
- FFFF (-1) - 为秒的指数
- 0003 - 为米的基本单位索引
- 0001 - 为米的指数
LabVIEW在内部仅根据物理量的基本单位保存该物理量,与用来显示的物理量的单位无关。
下表显示了LabVIEW使用的9个基本单位及其表示法,索引从0到8。
| 物理量名称 | 单位 | 缩写 | 索引值 |
|---|---|---|---|
| 平面角 | 弧度 | rad | 0 |
| 立体角 | 球面度 | sr | 1 |
| 时间 | 秒 | s | 2 |
| 长度 | 米 | m | 3 |
| 质量 | 千克 | kg | 4 |
| 电流 | 安培 | A | 5 |
| 热力学温度 | 开尔文 | K | 6 |
| 物质的量 | 摩尔 | mol | 7 |
| 发光强度 | 坎德拉 | cd | 8 |
字符串、路径和图片数据类型
字符串、路径和图片数据类型长度均为32位二进制,与数组维度的大小相似。当前唯一编码的值为十六进制的FFFFFFFF,表示大小可变。目前所有字符串、路径和图片均采用可变大小。字符串、路径和图片数据的实际长度与数据一并保存。
数组和簇数据类型
数组和簇的数据类型有其本身的类型代码。在数组和簇的数据类型中还包含了元素的数据类型、数组维度或簇元素数量等其他信息。
数组
数组的类型代码为40。数组的类型描述符包含以下格式:
<Nn> xx 40 <k dims><元素类型描述符>
下例为一个双精度浮点数一维数组的类型描述符,每组字符代表一个16进制的16位字。
000E 0040 0001 FFFF FFFF 0004 000A [类型特定信息]
类型描述符包含以下字:
- 000E - 表示共有12个字节,是整个类型描述符的长度,其中包括了元素类型索引。
- 0040 - 表示数组的类型代码
- 0001 - 表示一维,即数组的维数
- FFFF FFFF - 表示维度的大小,大小可变。LabVIEW可保存实际的维度大小,该值总是大于或等于0,且与数据一并保存。
- 0004 000A - 表示元素的类型描述符。元素的类型可以是除数组外的任何类型。在该例中,元素是双精度浮点数,且包含以下字:
- 0004 - 表示4个字节,即元素的大小
- 000A - 表示双精度浮点数的类型代码
该例中类型描述符保存缓冲区的格式如下:
| 类型描述符的数量 | 0000 0002 | 唯一的类型描述符有2个。 |
| 类型描述符0 | 0004 000A | 第一个类型描述符用于双精度浮点数。 |
| 类型描述符1 | 000E 0040 0001 FFFF FFFF | 第二个类型描述符表示数组。000E是整个类型描述符的长度,其中包括了元素类型索引。数组的大小可变,因此其维数为FFFFFFFF。 |
| 已使用类型的数量 | 0002 | 已使用的类型总数为2。 |
| 已使用类型 | 0000 0001 | 已使用的类型是0和1。 |
以下范例表示的是一个布尔值二维数组的类型描述符:
0012 0040 0002 FFFF FFFF FFFF FFFF 0004 0021 [类型特定信息]
类型描述符包含以下字:
- 0012 - 表示共有18个字节,是整个类型描述符的长度,其中包括了元素类型索引。
- 0040 - 表示数组的类型代码
- 0002 - 表示二维,即数组的维数
- FFFF FFFF (-1) - 表示第一个维度的大小,即大小可变
- FFFF FFFF (-1) - 表示第二个维度的大小,即大小可变
- 0004 0021 - 表示元素的类型描述符。在该例中,元素是布尔值,且包含以下字:
- 0004 - 表示4个字节,即元素的大小
- 0021 - 表示布尔值的类型代码
该例中类型描述符保存缓冲区的格式如下:
| 类型描述符的数量 | 0000 0002 | 唯一的类型描述符有2个。 |
| 类型描述符0 | 0004 0021 | 第一个类型描述符表示布尔值。 |
| 类型描述符1 | 0012 0040 0002 FFFF FFFF FFFF FFFF | 第二个类型描述符表示数组。0012是整个类型描述符的长度,其中包括了元素类型索引。数组的大小可变,因此其维数为FFFFFFFF。 |
| 已使用类型的数量 | 0002 | 已使用的类型总数为2。 |
| 已使用类型 | 0000 0001 | 已使用的类型是0和1。 |
簇
簇的类型代码为50。簇的类型描述符包含以下格式:
<Nn> xx 50 <k elems><元素类型描述符>
下例为包含两个整数(一个带符号16位整数,一个不带符号16位整数)的类型说明符。每组字符表示一个16进制的16位字:
000E 0050 0002 0004 0002 0004 0007
类型描述符包含以下字:
- 000E - 表示共有14个字节
- 0050 - 表示簇的类型代码
- 0002 - 表示两个元素,即簇中的元素数量
- 0004 0002 - 表示第一个元素的类型描述符,即有符号16位整数:
- 0004 - 表示4个字节
- 0002 - 表示有符号16位整数的类型代码
- 0004 0007 - 表示第二个元素的类型描述符,即无符号32位整数:
- 0004 - 表示4个字节
- 0007 - 表示无符号32位整数的类型代码
类型描述符保存缓冲区的格式如下:
| 类型描述符的数量 | 0000 0003 | 唯一的类型描述符有3个。 |
| 类型描述符0 | 0004 0002 | 第一个类型描述符用于有符号16位整数。 |
| 类型描述符1 | 0004 0007 | 第二个类型描述符用于无符号32位整数。 |
| 类型描述符2 | 000E 0050 0002 | 第三个类型描述符指簇。000E是整个类型描述符的长度,其中包括了簇类型索引。 |
| 已使用类型的数量 | 0003 | 已使用的类型总数为3。 |
| 已使用类型 | 0000 0001 0002 | 已使用类型为0、1和2。 |
数组和簇类型描述符含有其他类型描述符,因此可能会导致该类型描述符嵌套过深。
应注意的是幅值的类型并不包括在类型列表中。以下位一个类型描述符列表,其中包括一个双精度浮点数的一维数组和一个双精度浮点数的簇。
| 类型描述符的数量 | 0000 0003 | 唯一的类型描述符有3个。 |
| 类型描述符0 | 0005 000A 00 | 第一个类型描述符表示元素类型并与同类型的标量相同。 |
| 类型描述符1 | 000C 0040 0001 FFFF FFFF 0000 | 第二个类型描述符表示数组。000C是整个类型描述符的长度,其中包括了元素类型索引。数组的大小可变,因此其维数为FFFFFFFF。 |
| 类型描述符2 | 0008 0050 0001 0002 | 第三个类型描述符指簇。0008是整个类型描述符的长度,其中包括了簇类型索引。簇包含了一个该类型的元素,位于索引2。 |
| 已使用类型的数量 | 0003 | 已使用的类型总数为4。 |
| 已使用类型 | 0000 0001 0000 0002 | 已使用的类型是0、1、0和2。 |
应注意,簇中在索引2处被引用的类型必须在数组中已用的类型中查找才有效。已用类型中的第二个元素是0,与类型描述符0对应。
波形
波形的类型代码为54。其后为一个含有波形类型的字。字后为波形元素簇的类型描述符。共有5类波形。
- 模拟
- 数字
- 数字数据
- 时间标识
- 动态
模拟波形
下表为模拟波形的类型。
| 类型 | 子类型代码 |
|---|---|
| 8位二进制有符号 | 14 |
| 16位二进制有符号 | 2 |
| 32位二进制有符号 | 15 |
| 64位二进制有符号 | 19 |
| 双精度 | 3 |
| 单精度 | 5 |
| 扩展精度 | 10 |
| 8位二进制无符号 | 11 |
| 16位二进制无符号 | 12 |
| 32位二进制无符号 | 13 |
| 64位二进制无符号 | 20 |
| 单精度复数 | 16 |
| 双精度复数 | 17 |
| 扩展精度复数 | 18 |
例如,一个双精度波形,每组字符代表一个16进制的16位字:
0006 0054 0003 //波形大小、波形类型代码和双精度子类型代码3
0080 0050 0005 //簇大小、簇代码和元素个数
<时间标识的类型描述符>
<dt的类型描述符>
<元素类型数组的类型描述符>
<未用错误簇的类型描述符>
<属性的类型描述符>
其他类型模拟波形的类型描述符与双精度波形的类型描述符相似。其区别在于数组元素的类型及子类型不同。
数字波形和数字数据
数字波形是唯一子类型代码为8的波形。
例如,考虑以下示例,其中每组字符代表一个16进制的16位字:
00B6 0054 0008 //数字波形大小、波形类型代码和子类型代码8
<时间标识的类型描述符>
<dt的类型描述符>
<数字数据的类型描述符>
<未用错误簇的类型描述符>
<属性的类型描述符>
数字数据
数字数据是唯一具有波形类型代码且子类型代码为7的数据类型。
例如,考虑以下示例,其中每组字符代表一个16进制的16位字:
003E 0054 0007 //数字数据大小、波形类型代码和子类型代码7
<过渡的类型描述符>
<数据的类型描述符>
时间标识
时间标识的子类型代码为6。时间标识是一个带64位基数的128位定点数。LabVIEW将时间标识保存为一个包含四个整数的簇,其中前两个带符号整数(64位二进制)代表从1904年1月1日周五凌晨[01-01-1904 00:00:00]以来的秒数。后两个不带符号整数(64位二进制)表示小数秒部分。
001C 0054 0006 //时间标识大小、波形类型代码和时间标识子类型代码6
<模拟波形的类型描述符>