使用英语阅读

通过


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,则会在返回它之前,调用它来转换项值。 仅当项出现在输入中时才调用转换函数(永远不会使用默认值调用它)。

示例 1

以下函数假设键值是单个字节,且组中有 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, {}}

示例 2

下例解释了项值转换和默认项值。 带有键 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}