BinaryFormat.Group
BinaryFormat.Group(binaryFormat as function, group as list, optional extra as nullable function, optional lastKey as any) as function
参数如下:
binaryFormat
参数指定键值的二进制格式。group
参数提供有关已知项组的信息。- 可选的
extra
参数可用于指定函数,该函数会为任何非预期键之后的值返回二进制格式值。 如果未指定extra
参数,则会在存在非预期键值时引发错误。
group
参数指定项定义的列表。 每个项定义都是一个包含 3-5 个值的列表,如下所示:
- 键值。 与项对应的键的值。 此值在项集中必须唯一。
- 项格式。 与项值对应的二进制格式。 此值支持各项具有不同的格式。
- 项出现次数。 项应在组中出现的次数的 BinaryOccurrence.Type 值。 必需项不存在时会导致错误。 对必需或可选重复项的处理方式类似于非预期键值。
- 默认项值(可选)。 如果默认项值出现在项定义列表中,且不为 NULL,则会使用它代替默认值。 重复或可选项的默认值为 NULL,重复值的默认值为空列表 { }。
- 项值转换(可选)。 如果项值转换函数出现在项定义列表中,且不为 NULL,则会在返回它之前,调用它来转换项值。 仅当项出现在输入中时才调用转换函数(永远不会使用默认值调用它)。
以下函数假设键值是单个字节,且组中有 4 个预期项,所有项在键之后都跟有一个字节的数据。 项在输入中的显示方式如下所示:
- 键 1 为必需项,显示时值为 11。
- 键 2 为重复项,显示两次,值为 22,且结果为值 { 22, 22 }。
- 键 3 为可选项,不显示,且结果为 NULL 值。
- 键 4 为重复项,但不显示,结果为 { } 值。
- 键 5 不属于该组,但显示一次,值为 55。 使用键值 5 调用额外的函数,并返回对应该值 (BinaryFormat.Byte) 的格式。 已读取并弃用值 55。
使用情况
let
b = #binary({
1, 11,
2, 22,
2, 22,
5, 55,
1, 11
}),
f = BinaryFormat.Group(
BinaryFormat.Byte,
{
{1, BinaryFormat.Byte, BinaryOccurrence.Required},
{2, BinaryFormat.Byte, BinaryOccurrence.Repeating},
{3, BinaryFormat.Byte, BinaryOccurrence.Optional},
{4, BinaryFormat.Byte, BinaryOccurrence.Repeating}
},
(extra) => BinaryFormat.Byte
)
in
f(b)
输出
{11, {22, 22}, null, {}}
下例解释了项值转换和默认项值。 带有键 1 的重复项使用 List.Sum 对已读值的列表执行求和。 带有键 2 的可选项的默认值为 123,而非 NULL。
使用情况
let
b = #binary({
1, 101,
1, 102
}),
f = BinaryFormat.Group(
BinaryFormat.Byte,
{
{1, BinaryFormat.Byte, BinaryOccurrence.Repeating,
0, (list) => List.Sum(list)},
{2, BinaryFormat.Byte, BinaryOccurrence.Optional, 123}
}
)
in
f(b)
输出
{203, 123}