В настоящее время я начинаю работать с кодировкой DER (Distinguished Encoding Rules) и у меня возникают проблемы с пониманием кодировки целых чисел.
В справочном документе https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf эта кодировка определяется следующим образом:
8.3.1 Кодирование целочисленного значения должно быть примитивным. Октеты содержимого должны состоять из одного или нескольких октетов.
8.3.2 Если октеты содержимого кодирования целого значения состоят из более чем одного октета, то биты первого октета и бит 8 второго октета:
не все должны быть единицами; и
не должно быть все равно нулю.
ПРИМЕЧАНИЕ. - Эти правила гарантируют, что целочисленное значение всегда кодируется в наименьшем возможном количестве октетов.
8.3.3 Октеты содержимого должны быть двоичным числом с дополнительным двоичным числом, равным целочисленному значению, и состоять из битов 8–1 первого октета, за которыми следуют биты 8–1 второго октета, за которыми следуют биты 8–1. 1 каждый октет по очереди до последнего октета содержимого октетов включительно.
На другом сайте, https://docs.microsoft.com/en-us/windows/desktop/seccertenroll/about-integer, объясняется, что для положительных чисел, двоичное представление которых начинается с 1, нулевой байт добавляется впереди. Это также упоминается в ответах на предыдущий вопрос о стековом потоке: Основное правило кодирования ASN целого числа .
К сожалению, из этих ответов я не вижу, как эта последняя инструкция может быть выведена из правил справочного документа.
Например, если я хочу кодировать число 128, почему я не могу сделать это как
[тег байта] [длина байта] 10000000?
Я знаю, что правильная кодировка будет [tag byte] [length byte] 00000000 10000000, но какое условие повреждено вариантом выше? Вероятно, это как-то связано с дополнением к двум, но разве это дополнение к двоим не больше 10000000?
Надеюсь, вы поможете мне понять, почему описание на сайте Microsoft эквивалентно первоначальному определению. Спасибо.