Уже даже и не знаю, как объяснять...
Внутри гетбитса есть буфер битов... Они оттуда вынимаются, пока не кончатся. Как кончатся -- новый байтик (или ворд) подчитываются из *единственного* байтового потока.
Из него же (байтового потока) подчитываются и байты для ссылок, ежели таковые требуются.
mhmt-globals.h: UBYTE * indata; // to use in normal depacking process -- begins from input file data
angry_troll wrote:
Shaos wrote:
как это работает
Уже даже и не знаю, как объяснять...
Внутри гетбитса есть буфер битов... Они оттуда вынимаются, пока не кончатся. Как кончатся -- новый байтик (или ворд) подчитываются из *единственного* байтового потока.
Из него же (байтового потока) подчитываются и байты для ссылок, ежели таковые требуются.
как? байты для ссылок могут начинаться где угодно - они не выровнены на границу байта, разве нет?
или там реально неиспользуемые дырки? на чтении невыровненного 1 бита и затем выровненного 1 байта можно до 7 бит потерять, что между ними пропускаются...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Я прям даже и не знаю, как ещё объяснить.
биты берутся ИЗ БУФЕРА длиной в 1 байт!
А не сразу из запакованного файла.
этот буфер ПОПОЛНЯЕТСЯ целым байтом когда опустошается
Поэтому байты берутся байтами выровненными, а биты -- битами, но из буфера.
Простейшая концепция, но основа всех (почти) депакеров на спектурме.
angry_troll wrote:Я прям даже и не знаю, как ещё объяснить.
биты берутся ИЗ БУФЕРА длиной в 1 байт!
А не сразу из запакованного файла.
этот буфер ПОПОЛНЯЕТСЯ целым байтом когда опустошается
Поэтому байты берутся байтами выровненными, а биты -- битами, но из буфера.
Простейшая концепция, но основа всех (почти) депакеров на спектурме.
хм, т.е. описание формата, на которые ты выше сослался, не соответствует действительности?
биты идут сами по себе, а байты - сами по себе и всё намешано? да - судя по всему так и есть - мрак...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Если нужен бит,а его уже нет (все 8 ко─
нчились) - то новый байт выбирается из по─
тока. Оттуда же выбираются и байты,обозна─
ченные <byte> - но только после выборки
всех битов ссылки.
А я как имевший дело с мегалзом, понимающий более-менее его распаковщик и т.д. -- это очень удачный формат хранения ссылок. Когда нужны биты -- вот они, а когда байты -- вон они, по указателю в регистре лежат.
Отлаживать там практически нечего, покрмере в этом месте.
Хм, чего геморного-то, правильно перемешать битстрим с байтстримом? Внутри (в пакере) всё равно все ссылки существуют далеко не в виде битовых последовательностей. А вывод их в нужном формате -- тривиальная (хоть и немного утомительная) писанина. Проверить можно просто -- распаковкой нативным Z80-депакером.
SHAFF v1.0alpha (C) 2013,2017 A.A.Shabarshin <me@shaos.net>
Usage:
shaff [options] filename
Encoding options:
-0 to use SHAFF0 file format (by default)
-1 to use SHAFF1 file format
-b to save blocks as separate files
-lN to limit length of matches (by default 2 for SHAFF1 and 4 for SHAFF0)
Decoding options:
-d to decode SHAFF0 or SHAFF1 compressed file to file
-c to decode SHAFF0 or SHAFF1 compressed file to screen
Следом буду прикручивать битопоточный SHAFF1 (или сначала ускорением сжатия заняться?)
Я тут за главного - если что шлите мыло на me собака shaos точка net
SHAFF2 - формат с общей таблицей Хаффмана для литералов всего файла (формат ссылок остаётся таким же как в SHAFF1)
SHAFF3 - формат где у каждого 16КБ блока имеется своя таблица Хаффмана, включающая 1,2 и 3-символьные литералы, а также ссылки (этот формат должен побить всех самодельщиков : )
Кроме этого последний формат может стать полноценным архиватором, когда в один архив могут быть добавлены несколько файлов...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Shaos wrote:(этот формат должен побить всех самодельщиков : )
Главное ещё чтоб exomizer побил.
Кстати, если надо сжать несколько /разных/ блоков, например графика, музло, код, то если их сжимать exomizerом по отдельности -- будет выигрыш по сравнению с тем, если их сжимать одним конкатенированным куском.
кстати, почему exomizerа нет в твоих сравнивалках?