Compartir vía


BinaryFormat.Group

Sintaxis

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 parámetro binaryFormat especifica el formato binario del valor de clave.
  • El parámetro group proporciona información sobre el grupo de elementos conocidos.
  • El parámetro extra opcional se puede usar para especificar una función que devolverá un valor de formato binario para el valor seguido de cualquier clave inesperada. Si no se especifica el parámetro extra, se producirá un error si hay valores de clave inesperados.

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

  • Valor de clave. El valor de la clave que se corresponde con el elemento. Debe ser único dentro del conjunto de elementos.
  • Formato del elemento. El formato binario que se corresponde con el valor del elemento. Esto permite que cada elemento tenga un formato diferente.
  • Repetición del elemento. El valor BinaryOccurrence.Type con el número de veces que se espera que el elemento aparezca en el grupo. Los elementos necesarios que no están presentes provocan un error. Los elementos duplicados requeridos u opcionales se tratan como valores de clave inesperados.
  • Valor predeterminado del elemento (opcional). Si el valor predeterminado del elemento aparece en la lista de definiciones de elementos y no es NULL, entonces se usará este en vez del valor predeterminado. El valor predeterminado para los elementos repetidos u opcionales es NULL, y el valor predeterminado para los valores repetidos es una lista vacía { }.
  • Transformación del valor del elemento (opcional). Si la función de transformación de valores de elementos está presente en la lista de definiciones de elementos y no es NULL, se llamará a esta función para transformar el valor del elemento antes de que sea devuelto. 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

Lo siguiente asume un valor de clave que es un byte individual, con cuatro elementos esperados en el grupo, todos ellos con un byte de datos después de la clave. Los elementos aparecen en la entrada de la siguiente manera:

  • La clave 1 es obligatoria 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 {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 { }.
  • La clave 5 no forma parte del grupo, pero aparece una vez con el valor 55. Se llama a la función extra con el valor de clave 5 y se devuelve el formato correspondiente a ese valor (BinaryFormat.Byte). El valor 55 se lee y se 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

El siguiente ejemplo muestra la transformación del valor del elemento y el valor predeterminado del elemento. El elemento repetido 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 vez 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}