Но что если вы хотите, чтобы каждый кусок был не длиннее 10 шестнадцатеричных символов, но у вас есть длинная строка 1000 0, то вам нужен другой трюк, например, закодированное шестнадцатеричное значение, сообщающее вам, сколькопредыдущие нули, которые у вас есть, и т. д. Таким образом, кажется, что это становится сложным, интересно, есть ли уже установленные системы, которые выяснили, как это сделать
Да, вы слишком усложняете это.Для начала рассмотрим строки битов, длина которых по определению кратна 4. Они могут быть представлены в шестнадцатеричном виде, просто сгруппировав биты в 4 и переназначив их в шестнадцатеричные цифры:
raw: 11011110101011011011111011101111
group: 1101 1110 1010 1101 1011 1110 1110 1111
remap: D E A D B E E F
Итак 11011110101011011011111011101111 -> DEADBEEF
.То, что у всех грызунов был установлен верхний бит, было совпадением в результате выбора примера таким образом. По определению вход делится на группы по четыре, и каждая шестнадцатеричная цифра впоследствии декодируется в группу из четырех битов, включая начальные нули, если это применимо.Это все, что вам нужно для типичных хеш-кодов, кратных 4 битам.
Проблемы начинаются, когда мы хотим закодировать битовые строки переменной длины, а не обязательно кратные 4, тогдагде-то должен быть какой-то отступ, и декодер должен знать, сколько там было заполнения (и где, но местоположение - это соглашение, которое вы выбираете).Вот почему ваш пример казался таким неоднозначным: это .Необходимо добавить дополнительную информацию, чтобы сообщить декодеру, сколько бит следует отбросить.
Например, оставляя в стороне механизм, который передает количество битов заполнения, мы могли бы закодировать 1010101
как A5
или AA
или 5A
(и более!) в зависимости от местоположения, которое мы выбираем для заполнения, в зависимости от того, какое соглашение мы выбираем, декодер должен знать, что существует 1 бит заполнения.Чтобы вернуть это обратно в виде битов, 1010101
может быть закодирован как любой из них:
x101 0101
101x 0101
1010 x101
1010 101x
Где x
обозначает бит, который вставляется в кодер и сбрасывается в декодере.Значение этого бита на самом деле не имеет значения, потому что он отбрасывается, поэтому DA
также является точной кодировкой и т. Д.
Все варианты размещения отступа по-прежнему включают строку битов вкодироваться постепенно, без сохранения всей битовой строки в памяти, хотя для добавления отступа в первую шестнадцатеричную цифру необходимо знать длину битовой строки впереди.
Если вы спрашиваете этов контексте кодирования Хаффмана не нужно заранее рассчитывать длину строки битов, поэтому заполнение должно идти в конце.Часто к алфавиту добавляется дополнительный символ, который сигнализирует об окончании потока, что обычно делает ненужным явное сохранение количества битов заполнения (их может быть любое количество, но, поскольку они появляются после символа STOP,декодер автоматически игнорирует их).