ASN.1 и ДОПОЛНИТЕЛЬНО - PullRequest
0 голосов
/ 21 ноября 2019

Из того, что я понял, кодировка UPN ASN.1 упаковывает закодированные данные настолько эффективно, насколько это возможно.

Используя asn1scc Я скомпилировал это в c-код:

HelloWorld DEFINITIONS ::= BEGIN
    DataItems ::= SEQUENCE (SIZE (0..1024)) OF DataItem

    DataItem ::= SEQUENCE {
        name IA5String (SIZE (0..32)) OPTIONAL,
        address IA5String (SIZE (0..256)) OPTIONAL
    }

END

Я думал, что если сделать поле НЕОБЯЗАТЕЛЬНЫМ, оно будет занимать только полное пространство, когда оно включено, или только 1 бит. Также, если бы у меня была последовательность DataItems только из 3 элементов, то она бы занимала меньше места, чем полные 1024 элемента. Вместо этого, в приведенном выше примере используется 260226 байт!

Есть ли способ использовать ASN.1 для создания меньших выходных данных?

1 Ответ

1 голос
/ 27 ноября 2019

Во-первых, обратите внимание, что ваша спецификация недействительна ... вы должны добавить АВТОМАТИЧЕСКИЕ ТЕГИ

HelloWorld DEFINITIONS AUTOMATIC TAGS ::= BEGIN
    DataItems ::= SEQUENCE (SIZE (0..1024)) OF DataItem

    DataItem ::= SEQUENCE {
        name IA5String (SIZE (0..32)) OPTIONAL,
        address IA5String (SIZE (0..256)) OPTIONAL
    }

END

Причина в том, что вы не можете определить разницу между name и address при декодировании (какони оба необязательны).

Что касается вашего вопроса, ресурс, который я использую для быстрого ответа, - https://asn1.io/asn1playground/

Несколько примеров:

value DataItems ::= {
{ name "one" },
{ name "two" },
{ name "three" }
}  
-- Encoded successfully in 14 bytes:
-- 00707BF7 6583E9DF 7C2F4D1C B2E5

value DataItems ::= {
{ name "one", address "one" },
{ name "two", address "two" },
{ name "three", address "three" }
}
-- Encoded successfully in 27 bytes:
-- 00787BF7 6501EFDD 970FA77D E03E9DF7 E2F4D1CB 2E502F4D 1CB2E5
...