Compartir a través de


BinaryFormat.Group

Syntax

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

Acerca de

Los parámetros son los siguientes:

  • El binaryFormat parámetro especifica el formato binario del valor de clave.
  • El group parámetro proporciona información sobre el grupo de elementos conocidos.
  • El parámetro opcional extra se puede usar para especificar una función que devolverá un valor de formato binario para el valor después de cualquier clave inesperada. Si no se especifica el extra parámetro , se producirá un error si hay valores de clave inesperados.

El group parámetro especifica una lista de definiciones de elementos. Cada definición de elemento es una lista que contiene 3-5 valores, como se indica a continuación:

  • Valor de clave. Valor de la clave que corresponde al elemento. Debe ser único dentro del conjunto de elementos.
  • Formato de elemento. Formato binario correspondiente al valor del elemento. Esto permite que cada elemento tenga un formato diferente.
  • Repetición del elemento. Valor BinaryOccurrence.Type de cuántas veces se espera que el elemento aparezca en el grupo. Los elementos necesarios que no están presentes provocan un error. Los elementos duplicados obligatorios o opcionales se controlan como valores de clave inesperados.
  • Valor de elemento predeterminado (opcional). Si el valor de elemento predeterminado aparece en la lista de definiciones de elemento y no es NULL, se usará en lugar del valor predeterminado. El valor predeterminado para los elementos repetidos o opcionales es NULL y el valor predeterminado para los valores repetidos es una lista vacía { }.
  • Transformación de valor de elemento (opcional). Si la función de transformación de valor de elemento está presente en la lista de definiciones de elementos y no es null, se llamará a para transformar el valor del elemento antes de que se devuelva. Solo se llama a la función de transformación si el elemento aparece en la entrada (nunca se llamará con el valor predeterminado).

Ejemplo 1

A continuación se supone un valor de clave que es un solo byte, con 4 elementos esperados en el grupo, todos los cuales tienen un byte de datos después de la clave. Los elementos aparecen en la entrada de la siguiente manera:

  • Se requiere la clave 1 y aparece con el valor 11.
  • La clave 2 se repite y aparece dos veces con el valor 22 y da como resultado un valor de { 22, 22 }.
  • La clave 3 es opcional y no aparece y da como resultado un valor null.
  • La clave 4 se repite, pero no aparece, y da como resultado un valor de { }.
  • La clave 5 no forma parte del grupo, pero aparece una vez con el valor 55. Se llama a la función adicional con el valor de clave 5 y devuelve el formato correspondiente a ese valor (BinaryFormat.Byte). El valor 55 se lee y descarta.

Uso

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)

Salida

{11, {22, 22}, null, {}}

Ejemplo 2

En el ejemplo siguiente se muestra la transformación de valor de elemento y el valor de elemento predeterminado. El elemento de repetición con la clave 1 suma la lista de valores leídos mediante List.Sum. El elemento opcional con la clave 2 tiene un valor predeterminado de 123 en lugar de null.

Uso

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)

Salida

{203, 123}