Что это за целочисленное кодирование переменной длины?

Я документирую старый формат файла и поставил себя в тупик со следующей проблемой.

Кажется, что целые числа кодируются с переменной длиной, с числами <= 0x7F закодирован одним байтом, но>= 0x80 закодированы в два байта. Пример набора целых чисел и их закодированных аналогов:

  • 0x390 кодируется как 0x9007
  • 0x150 кодируется как 0xD002
  • 0x82 кодируется как 0x8201
  • 0x89 кодируется как 0x8901

Я еще не сталкивался с числами, которые больше, чем 0xFFFF, поэтому я не могу быть уверен, если / как они закодированы. Для жизни я не могу выработать здесь схему. Есть идеи?

1 ответ

Решение

На первый взгляд кажется, что числа разбиты на 7-битные порции, каждый из которых закодирован как 7 младших битов выходного байта, в то время как старший бит указывает, есть ли еще байты, следующие за этим (то есть последний байт закодированного целого числа имеет 0 как его MSB).

Наименее значимые биты входных данных идут первыми, поэтому, я думаю, вы могли бы назвать это "little endian".

Изменить: см. https://en.wikipedia.org/wiki/Variable-length_quantity (используется в буферах протоколов MIDI и Google)

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