BinaryFormat.Group

Syntax

BinaryFormat.Group(
    binaryFormat as function,
    group as list,
    optional extra as nullable function,
    optional lastKey as any
) as function

About

参数如下:

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