Я слежу за плейлистом Дэниела Хардинга на YouTube «Все, что вам нужно знать о JPEG», чтобы понять, как определяется формат файла JPEG.
В процессе декодирования код выглядит примерно так:
length = getNextSymbol()
...
coefficient = readBits(length)
mcu[0] = coefficient
и функция getNextSymbol делает что-то вроде этого:
currentCode = 0;
for i < 16:
currentCode = (currentCode << 1) | readNextBit()
for each huffman_code with length i:
if currentCode == huffman_code:
return huffman_symbols[huffman_code]
полный код размещен на github: https://github.com/dannye/jed/blob/master/src/decoder.cpp
Итак, мы сначала получаем символ, который должен быть значением, которое мы хотим проанализировать. Но после этого читаем длину этого символа. Таблица Хаффмана хранит только количество считываемых битов, а не «реальное» значение. Но при декодировании A C мы сохраняем символ непосредственно в наших значениях mcu!
Что я понял:
- код Хаффмана = битовая последовательность или путь к символу
- символ Хаффмана = значение, которое мы хотим закодировать с помощью этого кода
Вопрос: Почему мы читаем символ, а затем преобразуем его в длину, считывая эту длину и сохранение прочитанного значения. Но в A C мы храним символ без чтения бита.
Что мне здесь не хватает? Спасибо за помощь, мне это действительно сложно понять!