MegaLZ Формат пакованного файла: первый байт копируется в выход второй - идёт в биты биты в байте битов - со старшего. Если нужен бит, а его уже нет (все 8 кончились) - то новый байт выбирается из потока. Оттуда же выбираются и байты, обозначенные - но только после выборки всех битов ссылки. В формате ссылок: - байт, который выбирается из потока 1 - копировать в выход. 000abc - копировать 1 старый байт по смещению FFF8+[abc] от текущей позиции в выходе (abc==000 - смещение FFF8, abc==111 - FFFF) 001 - копировать 2 байта по смещению FF00+ (-1..-256) 0100 - копировать 3 байта по смещению FF00+ 0101abcd - копировать 3 байта по смещению (F[abcd]-1)*256+ (-257..-4352) более длинные ссылки удобно представить в виде 3 частей: префикс: 011 длина ссылки: 1a -> 4+[a] 01ab -> 6+[ab] 001abc -> 10+[abc] 0001abcd -> 18+[abcd] 00001abcde -> 34+[abcde] 000001abcdef -> 66+[abcdef] 0000001abcdefg -> 130+[abcdefg] (тут длина не более 255!) смещение: 0 - FF00+ назад (-1..-256) 1abcd - (F[abcd]-1)*256+ (-257..-4352) Метка конца потока: 011000000001 примеры: 000111 - повторить последний байт 001 - повторить последний байт дважды (смещение=-1, длина 2) 011 001101 10000 - ссылка длиной %101+10 = 15 байт со смещением -4352 Lord Vader