Перейти к содержимому


Фотография

Сжатие LZSS, нужна помощь.


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 32

#21 Марат

Марат

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
  • ГородАстана

Отправлено 24 Март 2015 - 18:13

Ошибка в функции write_lz.

Сообщение отредактировал Марат: 24 Март 2015 - 18:15

  • 0

#22 Марат

Марат

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
  • ГородАстана

Отправлено 24 Март 2015 - 18:55

 

А ты пробовал прогой Трикзтера распаковать данные? У него вроде под LZSS заточено GBA.

Она LZ77, а не LZSS

 

LZSS - это частный случай LZ77. К слову,  в LZSS флаги идут не в отдельном байте, а между литералами и парой длина + смещение.

Алгоритм примерно такой:

if ReadBit() = 1 then
begin
 Literal:= ReadBits(8);
 ....
end else
begin
 MatchLength:= ReadBits(4);
 MatchOffset:= ReadBits(12);
....
end;

Тот алгоритм, что у тебя в Ромхакинге обычно называют LZ77.


  • 0

#23 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 24 Март 2015 - 19:04

Вон оно как, спасибо за информацию, запомню:)


  • 0

#24 Proton

Proton

    Пользователь

  • Пользователи
  • PipPip
  • 27 сообщений

Отправлено 25 Март 2015 - 08:31

Спасибо за подсказку. Прошу проверить.


  • 1

Программная неудача.


#25 Марат

Марат

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
  • ГородАстана

Отправлено 25 Март 2015 - 09:46

Спасибо за подсказку. Прошу проверить.

 

У тебя же 12 битное смещение, поэтому надо писать так:

 lz_d1=(lz_dist&0xf00)>>8;


  • 0

#26 Proton

Proton

    Пользователь

  • Пользователи
  • PipPip
  • 27 сообщений

Отправлено 25 Март 2015 - 10:17

Всё верно. Случайно добавил лишнюю "F" в маске.

Марат, а ты свою утилиту для Monster World в C++, С# или Delphi писал?


  • 0

Программная неудача.


#27 Марат

Марат

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
  • ГородАстана

Отправлено 25 Март 2015 - 11:53

На дельфи. Я всё пишу на дельфях. Я уже привык к дельфи.


  • 0

#28 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 25 Март 2015 - 13:40

К сожалению, под самый конец сбивается...
3579ce5c338cbfedd3e075691e560a15.png
Может я что-то не так исправил:


  • 0

#29 Марат

Марат

    Пользователь

  • Пользователи
  • PipPip
  • 14 сообщений
  • ГородАстана

Отправлено 25 Март 2015 - 13:48

    if (chunk.bitcount<8 && chunk.bitcount!=0)

    {
        int bit_shift;
        bit_shift=8-chunk.bitcount;
        chunk.code=chunk.code<<bit_shift;
        _outputData[_headerPosition]=chunk.code;
    }

Здесь ошибка. Сдвиг надо делать вправо, а не влево.


  • 1

#30 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 25 Март 2015 - 13:52

Здесь ошибка. Сдвиг надо делать вправо, а не влево.

Исправил, заработало.

 

Большое спасибо, Proton, большое спасибо, Марат. Вы мои кумиры! ;)


  • 0

#31 Proton

Proton

    Пользователь

  • Пользователи
  • PipPip
  • 27 сообщений

Отправлено 25 Март 2015 - 15:26

Ребята, извините за косячный код. На скорую руку, без проверки на расжатие.


  • 0

Программная неудача.


#32 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 25 Март 2015 - 15:34

Ребята, извините за косячный код. На скорую руку, без проверки на расжатие.

Да ничего, главное разобрались и всё работает. Кстати, сжатие лучше чем оригинал.


  • 0

#33 TTEMMA

TTEMMA

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 122 сообщений
  • ГородСмоленск

Отправлено 26 Март 2015 - 00:22

Может и нагавн*кодил, но работает :)


  • 0




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Рейтинг@Mail.ru Яндекс.Метрика