Ограничения одного значения в кодировке PER

Насколько я понимаю, в следующем утверждении X.691 говорится, что типы INTEGER с ограничениями на одно значение ничего не будут кодировать.

13.2.1 Если ограничения, видимые для PER, ограничивают целочисленное значение одним значением, то не должно быть никаких дополнений к списку полей, завершающих эти процедуры.

Я также понимаю, что в ASN.1 ничего не закодировано, как показано ниже. и я протестировал его с помощью asn1tools в Python.

Num1 ::= INTEGER (40)

Input: Num1 = 40
Output: b'' (Empty bit string)

При использовании объединения для ограничений с одним значением нет гарантии, что закодированное значение всегда будет одинаковым. Однако с помощью asn1tools в Python ничего не кодируется.

Num2 ::= INTEGER (40 | 50 | 60)

Encoding:
  Input: Num2 = 40
  Output: b'' (Empty bit string)
  Input: Num2 = 50
  Output: b'' (Empty bit string)
  Input: Num2 = 60
  Output: b'' (Empty bit string)

Decoding:
  Input: b'' (Empty bit string)
  Output: 40

Я предполагал, что он будет следовать кодировке типа ENUMERATED, но не нашел для этого основы в X.691.

Мне интересно, правильно ли, что в приведенном выше случае ничего не кодируется, и не является ли это больше ограничением на одно значение при использовании объединения.

Любая помощь приветствуется.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ограничение используемого вами инструмента...

Если вы попробуете https://asn1.io/, вы увидите следующие результаты.

Num2 ::= INTEGER (40 | 50 | 60)

Encoding:
  Input: Num2 = 40
  Output: b'00000000' (0x00 - No bits set)
  Input: Num2 = 50
  Output: b'01010000' (0x50)
  Input: Num2 = 60
  Output: b'10100000' (0xA0)

Спасибо Полу за объяснение в комментариях, как это получить из документа X691...

Диапазон INTEGER: 60-40=20.

«диапазон» меньше или равен 255 (случай битового поля), нам нужно 5 бит

Для этого необходимо создать битовое поле из 5 бит, содержащее значение («n» – «нижняя граница») в качестве кодирование неотрицательных двоичных целых чисел в битовом поле, как указано в 11.3.

Битовое поле будет содержать 0 для значения 40, 10 для значения 50 и 20 для значения 60.

Итак, вы получаете кодировку трех возможных значений Num2.

  • 40: кодируем 0 на 5 битах: 00000
  • 50: кодируем 10 по 5 бит: 01010
  • 60: кодируем 20 по 5 бит: 10100

Вы обнаружите, что шестнадцатеричное значение выше дополнения 3 битами установлено в 0.

Я не особо внимательно читал X.691, поэтому не хочу однозначно утверждать, что инструмент выдает неправильные кодировки, но я так думаю. На первый взгляд, этот тип должен быть закодирован как ограниченное целое число в диапазоне 60-40+1=21, и тогда закодированное значение будет относиться к нижней границе (40). Я уверен, что кто-нибудь из OSS (создателя этого инструмента) прокомментирует.

Kevin 08.07.2024 15:10

Я только что попробовал это на asn1.io, и кодировка значения 40 не b'', а 0x00, поскольку нижняя граница ограничения равна 40, которая кодируется как 0x00, поскольку нижняя граница вычитается перед кодированием значения. Обратите внимание, что диапазон ограничений требует только первых 5 бит для кодирования значений. Вот почему вы видите 0x50 для 50 и 0xA0 для 60.

Paul Thorpe 08.07.2024 20:09

Я отредактировал ответ ЯФреда, чтобы более точно отразить результат с сайта asn1.io.

Paul Thorpe 08.07.2024 20:20

упс, спасибо за исправление и спасибо за объяснение

YaFred 08.07.2024 23:38

Казалось бы, когда ограничения с одним значением объединяются, их следует кодировать как ограниченное целое число, где верхняя граница является наибольшим из ограничений, а нижняя граница — наименьшим. Я буду использовать asn1.io, который Прад любезно указал мне для дальнейшего изучения x.691. Я хотел бы выразить благодарность ЯФреду, Кевину и Полу за их ответы.

Kay 09.07.2024 13:55

Да. Следует иметь в виду, что наличие ограничения не предполагает, что оно закодировано в PER. Таким образом, объединение используется для проверки значения INTEGER (40|50|60), но видимое ограничение PER на самом деле равно (40..60).

YaFred 15.07.2024 13:50

Другие вопросы по теме