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}