Основное правило кодирования ASN целого числа
В настоящее время я изучаю Абстрактную синтаксическую нотацию 1 и читаю Рекомендацию МСЭ-Т X.690.
На странице 15 в пункте 8.3.2 написано:
Если октеты содержимого кодировки целочисленных значений состоят из более чем одного октета, то биты первого октета и бит 8 второго октета:
- не все будут едины; а также
- не все должны быть равны нулю.
ПРИМЕЧАНИЕ. - Эти правила гарантируют, что целочисленное значение всегда кодируется в наименьшем возможном количестве октетов.
Я понимаю, что для того, чтобы целое число всегда было закодировано в наименьшем возможном количестве октетов, первый октет не должен быть нулевым.
Но как насчет тех? Если я хочу кодировать значение 65408 (1111 1111 1000 0000), используя Основные правила кодирования, как мне это сделать?
2 ответа
Я понимаю, что для того, чтобы целое число всегда было закодировано в наименьшем возможном количестве октетов, первый октет не должен быть нулевым.
Не обязательно. Если старший бит целого числа установлен в 1, то значение считается отрицательным (в случае целых чисел со знаком). Чтобы обозначить целое положительное число, добавляется ноль (0) ведущего октета. Это в общем.
Вот хорошая статья о Integer-кодировании: http://msdn.microsoft.com/en-us/library/windows/desktop/bb540806(v=vs.85).aspx
Кодировка 2 дополнения. Вам нужен ведущий октет 0000 0000. Обратите внимание, что это не будет нарушать цитируемое вами правило, так как бит 8 второго октета будет равен 1.