Существует много подходов к кодированию чисел переменной длины :
Один простой подход - это подход байтов переменной длины, который использует один бит каждого байта, чтобы определить, является ли другой байт значенияследующим образом. Например, в каждом байте используйте старший бит = 1, чтобы сказать, что есть по крайней мере еще один байт, - и используйте старший бит = 0, чтобы сказать, что этот байт является последним байтом.
Декодирование,здесь в int
тип выглядит следующим образом:
int decodeVariableLengthNumber ( unsigned char *pc ) {
int value = 0; // size here should accomodate the largest possible
for(;;) {
unsigned byte b = *pc++;
value <<= 7;
value |= b & 127;
if ( b & 128 )
continue;
return value;
}
}
И кодирование является просто обратным, как требуется для этого декодирования.
Это может кодировать 7 битов данных / содержимого в каждых 8битовый байт, поэтому числа от 0 до 127 в одном байте и от 0 до 16383 в двух байтах, например.
Также можно использовать смещения, так что первый байт кодирует, 1..128 вместо 0. .127, если это имеет больше смысла для приложения. Кроме того, двухбайтовый формат может предполагать, что один не будет использовать 2-х байтовую кодировку для числа, которое соответствует 1-байтовой форме, поэтому они могут быть смещены на 127 (или 128) для немного большего охвата.
Вы можете кодировать k
таким образом, а затем иметь фиксированный размер k
байт для x
- или вы можете просто кодировать x
непосредственно непосредственно в этом режиме переменной длины без необходимости кодирования k
длячисло байтов.
Другие соображения для размышления:
- самосинхронизирующиеся кодировки , что может даже иметь некоторые преимущества безопасности в архитектуре набора команд.
- UTF-8 Кодирование переменной длины со свойством самосинхронизации.
- RISC V RISC V поддерживает команды переменной длины, кратные2 байта.