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


Фотография

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


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

#1 TTEMMA

TTEMMA

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

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

Отправлено 18 Март 2015 - 21:00

Собственно, проблема в самой запаковке - я понятия не имею, как написать программу, для сжатия. До этого со сжатиями не работал, всё что сделал, это переписал распаковщик LZ11 с C# на Delphi.
Ещё давно, Leo2236 переписал для меня распаковщик LZSS с C++ на Delphi. Само сжатие флаговое(Может есть и другие типы). Исходный код таков:
 

procedure TForm1.LZSSDec(LZSS_Ms:TStream);
var
  Temp_Ms:Tmemorystream;
  ch, Temp_, Temp: Byte;
  i, jump, size, flag: Integer;
  b: array[0..16] of Byte;
  Temp_Offset, Last_Offset: DWORD;
begin
  flag := 1;
  LZSS_Ms.Position := 0;
  Temp_Ms := TMemoryStream.Create;
  while LZSS_Ms.Position < LZSS_Ms.Size do
  begin
    if flag = 1 then
    begin
      LZSS_Ms.Read(Temp, 1);
      flag := Temp or $100;
    end;
    LZSS_Ms.Read(ch, 1);
    if Bool(flag and 1) then Temp_Ms.Write(ch, 1) else
    begin
      LZSS_Ms.Read(Temp_, 1);
      jump := ((Temp_ and $F) shl 8) or ch;
      size := (Temp_ shr 4) + 2;
      Temp_Offset := Temp_Ms.Position;
      Temp_Ms.Position := Temp_Ms.Position - jump;
      Last_Offset := Temp_Ms.Position;
      for i := 0 to size - 1 do
      begin
        Temp_Ms.Read(b[i], 1);
        if Temp_Ms.Position >= Temp_Ms.Size then
          Temp_Ms.Position := Last_Offset;
      end;
      Temp_Ms.Position := Temp_Offset;
      Temp_Ms.Write(b, size);
    end;
    flag := flag shr 1;
  end;
LZSS_Ms.Size:=0;
Temp_Ms.Position:=0;
LZSS_Ms.CopyFrom(Temp_Ms,Temp_Ms.Size);
LZSS_Ms.Position:=0;
Temp_Ms.Free;
end;

Относительно, как всё это работает - понимаю. Но не могу понять, как сжать распакованные данные? Объясните, дураку.
 
P.S.Вряд ли, но может кому и понадобится:


  • 0

#2 Greengh0st

Greengh0st

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

  • Администраторы
  • 1 500 сообщений

Отправлено 18 Март 2015 - 21:15

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


  • 0

#3 TTEMMA

TTEMMA

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

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

Отправлено 18 Март 2015 - 21:23

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

Она LZ77, а не LZSS


  • 0

#4 SPOT

SPOT

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

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 18 Март 2015 - 21:23

TTEMMA, можно увидить исходник на C#?


  • 0

#5 TTEMMA

TTEMMA

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

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

Отправлено 18 Март 2015 - 21:31

TTEMMA, можно увидить исходник на C#?

С C# я переписывал LZ11, а мне нужно разобраться с LZSS, но исходник вот:


  • 0

#6 SPOT

SPOT

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

  • Журналисты
  • PipPipPip
  • 600 сообщений

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

Относительно, как всё это работает - понимаю. Но не могу понять, как сжать распакованные данные?

Аналогично тому, как они разжимаются, только наоборот :)

А что конкретно не ясно, уточни?


  • 0

#7 TTEMMA

TTEMMA

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

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

Отправлено 18 Март 2015 - 22:29

Не понятно больше то, как написать функцию для поиска одинаковых значений, а потом ещё и установки флагов под эти найденные повторы


  • 0

#8 Mefistotel

Mefistotel

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

  • Журналисты
  • PipPipPip
  • 148 сообщений
  • ГородМагадан

Отправлено 18 Март 2015 - 23:53

Известно, что распаковщик написать проще, чем запаковщик.) Марат бы мог подсказать, только он вроде и не зареган здесь.
Для примеров распаковки не помешали бы и файлы для наглядности (запакованный, распакованный).
  • 0

#9 TTEMMA

TTEMMA

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

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

Отправлено 19 Март 2015 - 00:02

Прошу

Прикрепленные файлы

  • Прикрепленный файл  LZSS_Files.rar   46,9К   103 Количество загрузок:

  • 0

#10 Proton

Proton

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

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

Отправлено 19 Март 2015 - 07:58

Готов помочь разобраться, но времени сейчас совсем нет.


  • 0

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


#11 TTEMMA

TTEMMA

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

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

Отправлено 19 Март 2015 - 08:16

Буду рад и благодарен вашей помощи
  • 0

#12 SPOT

SPOT

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

  • Журналисты
  • PipPipPip
  • 600 сообщений

Отправлено 23 Март 2015 - 12:00

Как успехи?


  • 0

#13 Proton

Proton

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

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

Отправлено 23 Март 2015 - 15:38

На этой неделе у меня будет возможность обсудить эту тему.


  • 0

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


#14 TTEMMA

TTEMMA

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

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

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

Ох, шикарно, буду ждать.


  • 0

#15 Proton

Proton

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

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

Отправлено 24 Март 2015 - 12:20


  • 1

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


#16 TTEMMA

TTEMMA

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

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

Отправлено 24 Март 2015 - 12:48

Ух ты, быстро:) Спасибо.

Осталось только мне под Delphi переписать и все.


  • 0

#17 Proton

Proton

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

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

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

Советую переходить на С++. Конечно, я тоже начинал с Delphi и Pascal, но большую часть вещей там не сделаешь. В моём коде в самом начале файла "st101_compressed.bin" записывается размер упакованных данных. Функция поиска использует полный перебор. Для описания совпадений и контрольных байтов с флагами используются соответствующие структуры.

Декомпрессор я не писал, поэтому прошу проверить корректность сжатия.


  • 0

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


#18 Mefistotel

Mefistotel

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

  • Журналисты
  • PipPipPip
  • 148 сообщений
  • ГородМагадан

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

Ух ты, быстро :) Спасибо.

Осталось только мне под Delphi переписать и все.

Не забудь реверснутый код потом приложить. :)


  • 0

#19 TTEMMA

TTEMMA

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

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

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

Советую переходить на С++. Конечно, я тоже начинал с Delphi и Pascal, но большую часть вещей там не сделаешь. В моём коде в самом начале файла "st101_compressed.bin" записывается размер упакованных данных. Функция поиска использует полный перебор. Для описания совпадений и контрольных байтов с флагами используются соответствующие структуры.

Декомпрессор я не писал, поэтому прошу проверить корректность сжатия.

Да я собираюсь переходить, или на C++, или на C#.

Относительно, я всё понял, вечерком начну переписывать.

 

 

 

Ух ты, быстро :) Спасибо.

Осталось только мне под Delphi переписать и все.

Не забудь реверснутый код потом приложить. :)

 

Хорошо;)


  • 0

#20 TTEMMA

TTEMMA

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

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

Отправлено 24 Март 2015 - 14:34

Скомпилировал ваш проект, сжал распакованный файл и пытался расжать с помощью моей программы - получается совсем не то, что должно быть.

Убрал с вашего исходника добавления размера файла, начало хидера поставил на 0, начала исходного файла на 1. После этого стал похож на оригинал(распакованный), но вот беда, размер больше на $20, и только начальные байты похожи на оригинал, дальше то не те байты, то оригинальные.


  • 0




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

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

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