模板 (X 文件格式,文本编码)

模板定义如何解释数据流 - 数据由模板定义进行调节。 本部分讨论模板的以下方面,并提供示例模板。

有一个特殊的模板 - 标头模板。 建议每个应用程序定义标头模板,并使用它来定义特定于应用程序的信息,例如版本信息。 如果存在,则此标头由 .x 文件格式 API 读取。 如果标志成员可用,则用于确定如何解释以下数据。 标志成员(如果已定义)应为 DWORD。 当前定义了一个位 - 位 0。 如果此位是明确的,则文件中的以下数据是二进制数据。 如果已设置,则以下数据为文本。 可以使用多个标头数据对象在文件中的二进制文件和文本之间切换。

模板表单、名称和 UUID

模板具有以下表单。

template <template-name> {
<UUID>
    <member 1>;
...
    <member n>;
[restrictions]
}

模板名称是可以包含下划线字符 (_) 的字母数字名称。 它不得以数字开头。 UUID 是格式化为 Open Software Foundation 分布式计算环境标准的通用唯一标识符,并用尖括号(<>)括起来。 例如:<3D82AB43-62DA-11cf-AB39-0020AF71E433>。

模板成员

模板成员由命名数据类型组成,后跟可选名称或命名数据类型的数组。 下表定义了有效的基元数据类型。

类型 大小
16 位
DWORD 32 位
IEEE 浮点数
64 位
8 位
UCHAR 8 位
字节 8 位
字符串 NULL 终止字符串
CSTRING 带格式的 C 字符串(不支持)
UNICODE Unicode 字符串(不支持)

 

还可以在模板定义中引用前面在数据流中遇到的模板定义的其他数据类型。 不允许使用转发引用。

任何有效的数据类型都可以表示为模板定义中的数组。 以下示例显示了基本语法。

array <data-type> <name>[<dimension-size>];

<维度大小> 可以是整数或对另一个模板成员的命名引用,然后替换其值。 数组可以是 n 维,其中 n 由尾随语句的成对方括号数确定,如以下示例所示。

array DWORD FixedHerd[24];
array DWORD Herd[nCows];
array FLOAT Matrix4x4[4][4];

模板限制

模板可以打开、关闭或受限。 这些限制确定哪些数据类型可以出现在模板定义的数据对象的直接层次结构中。 打开的模板没有限制,关闭的模板拒绝所有数据类型,受限模板允许命名的数据类型列表。

用于指示打开模板的语法是用方括号括起来的三个句点。

[ ... ]

命名数据类型的逗号分隔列表(可选)后跟方括号括起来的 UUID 表示受限制的模板。

[ { data-type [ UUID ] , } ... ]

上述任一项的缺失都表示已关闭的模板。

模板示例

下面显示了一个示例模板。

template Mesh {
<3D82AB44-62DA-11cf-AB39-0020AF71E433>
DWORD nVertices;
array Vector vertices[nVertices];
DWORD nFaces;
array MeshFace faces[nFaces];
 [ ... ]                // An open template
}
template Vector {
<3D82AB5E-62DA-11cf-AB39-0020AF71E433>
FLOAT x;
FLOAT y;
FLOAT z;
}                        // A closed template
template FileSystem {
<UUID>
STRING name;
[ Directory <UUID>, File <UUID> ]    // A restricted template
}

文本编码