Вам конкретно номер строки назвать? Или намекаете, что range coding и арифметическое кодирование - это не одно и то же?
Вам конкретно номер строки назвать? Или намекаете, что range coding и арифметическое кодирование - это не одно и то же?
Я покопал подробнее, оказывается range coder в LZMA кодирует только однобитные значения. Т.е. упрощён донельзя. А уже на его базе реализуется всё остальное. Например, кодирование произвольного алфавита делается так: таблица символов представляется деревом, спускаемся по дереву, кодируя на каждом шаге направление спуска влево или вправо.
Интересно, что байты-литералы тоже кодируются побитно: на каждый бит своя модель (вероятность), зависящая от предыдущих бит.
Неплохое описание нашлось в английской википедии.
Если всё ещё интересны исходники, берём LZMA SDK. Ядро кодера находится в файле \C\LzmaEnc.c, функции RangeEnc_*, LitEnc_*, RcTree_*. Декодер - в файле C\LzmaDec.c, первые 67 строк.
По просьбам трудящихся исходники oh1c/oh2c переезжают в публичный репозиторий: https://gitlab.com/eugene77/optimal-hrust-compressor
Dart Alver (09.08.2020), Destr (02.01.2020), Dimon spb (17.10.2022)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)