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

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

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

模板表单、名称和 UUID

模板具有以下形式。

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

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

模板成员

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

类型 大小
WORD 16 位
DWORD 32 位
FLOAT IEEE float
DOUBLE 64 位
CHAR 8 位
UCHAR 8 位
BYTE 8 位
STRING NULL 终止字符串
CSTRING 不支持) (带格式的 C 字符串
UNICODE 不支持 unicode 字符串 ()

 

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

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

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

<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
}

文本编码