Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.04.2013, 04:23
DrGeorg DrGeorg вне форума
Прохожий
 
Регистрация: 26.04.2013
Сообщения: 38
Версия Delphi: RAD Studio XE3
Репутация: 10
По умолчанию Работа с алгоритмом архивации LZO

Помогите неразумному уже вторые сутки бьюсь и гуглил и что только не подставлял никак не могу разобраться: Нашел вот такой алгоритм:

Код:
function lzo_decompress(const CData; CSize: LongInt; var Data; var Size: LongInt): LongInt; cdecl;
asm
  DB $51
  DD $458B5653,$C558B08,$F08BD003,$33FC5589,$144D8BD2,$68A1189,$3C10558B,$331C7611,$83C88AC9
  DD $8346EFC1,$820F04F9,$1C9,$8846068A,$75494202,$3366EBF7,$460E8AC9,$F10F983,$8D83,$75C98500,$8107EB18
  DD $FFC1,$3E804600,$33F47400,$83068AC0,$C8030FC0,$83068B46,$28904C6,$4904C283,$F9832F74,$8B217204,$83028906
  DD $C68304C2,$4E98304,$7304F983,$76C985EE,$46068A14,$49420288,$9EBF775,$8846068A,$75494202,$8AC933F7
  DD $F983460E,$C12B7310,$828D02E9,$FFFFF7FF,$C933C12B,$C1460E8A,$C12B02E1,$8840088A,$88A420A,$420A8840
  DD $288008A,$113E942,$F9830000,$8B207240,$FF428DD9,$8302EBC1,$C32B07E3,$1E8ADB33,$3E3C146,$2B05E9C1
  DD $D9E949C3,$83000000,$2F7220F9,$851FE183,$EB1875C9,$FFC18107,$46000000,$74003E80,$8AC033F4,$1FC08306
  DD $F46C803,$FBC11EB7,$FF428D02,$C683C32B,$8369EB02,$457210F9,$D98BC28B,$C108E383,$C32B0BE3,$8507E183
  DD $EB1875C9,$FFC18107,$46000000,$74003E80,$8ADB33F4,$7C3831E,$F46CB03,$FBC11EB7,$83C32B02,$D03B02C6
  DD $9A840F,$2D0000,$EB000040,$2E9C11F,$2BFF428D,$8AC933C1,$E1C1460E,$8AC12B02,$A884008,$88008A42
  DD $51EB4202,$7206F983,$2BDA8B37,$4FB83D8,$188B2E7C,$8904C083,$4C2831A,$8B02E983,$831A8918,$C08304C2
  DD $4E98304,$7304F983,$76C985EE,$40188A20,$49421A88,$15EBF775,$8840188A,$188A421A,$421A8840,$8840188A
  DD $7549421A,$8AC933F7,$E183FE4E,$FC98503,$FFFE4284,$46068AFF,$49420288,$C933F775,$E9460E8A,$FFFFFECA
  DD $8B10552B,$10891445,$75FC753B,$EBC03304,$FFF8B80D,$753BFFFF,$830372FC,$5B5E04C0,$90C35D59
end;

procedure DecompressData(const InData: Pointer; InSize: LongInt; const OutData: Pointer; var OutSize: LongInt);
begin
  lzo_decompress(InData^, InSize, OutData^, OutSize);
end;
Делаю так:
Код:
...
Var Ms:TMemoryStream;
Begin
Ms:=TMemoryStream.Create;
Ms:=LoadFromFile('C:\Temp\MyFile.lzo');
DecompressData({Тут что только не подставлял...});
...
Результат - Types of actual and formal var parameters must be identical
Ну например
Код:
DecompressData(Ms.Memory, Ms.size, Ms.Memory, Ms.size{Тут она ругается...});
Что делать мжт кто знает?

Последний раз редактировалось DrGeorg, 26.04.2013 в 07:02.
Ответить с цитированием
  #2  
Старый 26.04.2013, 04:32
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

По ходу ms суётся и на вход и на выход? Наверное ещё один меморипоток нужен для выходного файла.
Ответить с цитированием
  #3  
Старый 26.04.2013, 04:39
DrGeorg DrGeorg вне форума
Прохожий
 
Регистрация: 26.04.2013
Сообщения: 38
Версия Delphi: RAD Studio XE3
Репутация: 10
По умолчанию

Расскажите поподробней, Я даже делал так:
Код:
...
Var Ms, Os:TMemoryStream;
Begin
Ms:=TMemoryStream.Create;
Os:=TMemoryStream.Create;
Ms:=LoadFromFile('C:\Temp\MyFile.lzo');
DecompressData(Ms.Memory, Ms.size, Os.Memory, Os.size);
...
Не помогло...
Ругается на переменную OutSize: LongInt

Логика здравого смысла подсказывает, что надо копать в сорону методов Read и Write...
Цитата:
" Начнем анализ класса с методов Read и Write. Они абстрактные, значит реализованы в наследнике. Служат они для чтения данных из текущей позиции потока наследника TStream и записи в него соответственно. Первый параметр это сам буфер данных (внимание не указатель, а сама переменная буфера!). Второй размер буфера в байтах. Результат число переданных данных. Это базовые методы ввода/вывода. На них построена вся передача данных."
Только как это осуществить на моем примере?

Последний раз редактировалось M.A.D.M.A.N., 26.04.2013 в 09:27.
Ответить с цитированием
  #4  
Старый 26.04.2013, 07:16
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от DrGeorg
Логика здравого смысла подсказывает, что надо копать в сорону методов Read и Write...Только как это осуществить на моем примере?
Я так и не понял увж. доктор Трофимов, вы же вроде разобрались с подключением, или всё это не так? Тогда лучше или другой алгоритм использовать, напр. зиповский (а не 7зип, как в вашем случае) или продолжать блогера прессовать, пусть автор отдувается

З.Ы. Попробуйте вот это, может подойдёт.

Последний раз редактировалось Alegun, 09.05.2013 в 12:19.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
DrGeorg (26.04.2013)
  #5  
Старый 26.04.2013, 07:34
DrGeorg DrGeorg вне форума
Прохожий
 
Регистрация: 26.04.2013
Сообщения: 38
Версия Delphi: RAD Studio XE3
Репутация: 10
По умолчанию

Нет ZIP не подходит. У ZIP скорость (распаковки) маленькая! Для сравнения - LZO: 102 мб (300 мс), ZIP: 81 мб (1300 мс), LZMA: 61 мб (2400 мс). А у меня файл оч много весит...
И при чем тут:
Цитата:
7зип, как в вашем случае
В моем случае применяется быстродейственный алгоритм LZO!!!
__________________
Все смелые до begin...

Последний раз редактировалось DrGeorg, 26.04.2013 в 07:49.
Ответить с цитированием
  #6  
Старый 26.04.2013, 07:45
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Именно ЛЗО нужен? Можно ЛЗМА взять (он довольно сильно жмет), он полностью на паскале есть.
И да, в блоке asm не судьба было дизассемблировать?

Засунул твой код в дизасм
Код:
                push    ecx
                push    ebx
                push    esi
                mov     eax, [ebp+8]
                mov     edx, [ebp+0Ch]
                add     edx, eax
                mov     esi, eax
                mov     [ebp-4], edx
                xor     edx, edx
                mov     ecx, [ebp+14h]
                mov     [ecx], edx
                mov     al, [esi]
                mov     edx, [ebp+10h]
                cmp     al, 11h
                jbe     short loc_40103C
                xor     ecx, ecx
                mov     cl, al
                add     ecx, 0FFFFFFEFh
                inc     esi
                cmp     ecx, 4
                jb      loc_4011FA

loc_401031:
                mov     al, [esi]
                inc     esi
                mov     [edx], al
                inc     edx
                dec     ecx
                jnz     short loc_401031
                jmp     short loc_4010A2


loc_40103C:
                xor     ecx, ecx
                mov     cl, [esi]
                inc     esi
                cmp     ecx, 10h
                jnb     loc_4010D7
                test    ecx, ecx
                jnz     short loc_401066
                jmp     short loc_401057


loc_401050:
                add     ecx, 0FFh
                inc     esi

loc_401057:
                cmp     byte ptr [esi], 0
                jz      short loc_401050
                xor     eax, eax
                mov     al, [esi]
                add     eax, 0Fh
                add     ecx, eax
                inc     esi

loc_401066:
                mov     eax, [esi]
                add     esi, 4
                mov     [edx], eax
                add     edx, 4
                dec     ecx
                jz      short loc_4010A2
                cmp     ecx, 4
                jb      short loc_401099

loc_401078:
                mov     eax, [esi]
                mov     [edx], eax
                add     edx, 4
                add     esi, 4
                sub     ecx, 4
                cmp     ecx, 4
                jnb     short loc_401078
                test    ecx, ecx
                jbe     short loc_4010A2

loc_40108E:
                mov     al, [esi]
                inc     esi
                mov     [edx], al
                inc     edx
                dec     ecx
                jnz     short loc_40108E
                jmp     short loc_4010A2


loc_401099:
                mov     al, [esi]
                inc     esi
                mov     [edx], al
                inc     edx
                dec     ecx
                jnz     short loc_401099

loc_4010A2:
                xor     ecx, ecx
                mov     cl, [esi]
                inc     esi
                cmp     ecx, 10h
                jnb     short loc_4010D7
                shr     ecx, 2
                lea     eax, [edx-801h]
                sub     eax, ecx
                xor     ecx, ecx
                mov     cl, [esi]
                inc     esi
                shl     ecx, 2
                sub     eax, ecx
                mov     cl, [eax]
                inc     eax
                mov     [edx], cl
                inc     edx
                mov     cl, [eax]
                inc     eax
                mov     [edx], cl
                inc     edx
                mov     al, [eax]
                mov     [edx], al
                inc     edx
                jmp     loc_4011EA


loc_4010D7:
                cmp     ecx, 40h
                jb      short loc_4010FC
                mov     ebx, ecx
                lea     eax, [edx-1]
                shr     ebx, 2
                and     ebx, 7
                sub     eax, ebx
                xor     ebx, ebx
                mov     bl, [esi]
                inc     esi
                shl     ebx, 3
                shr     ecx, 5
                sub     eax, ebx
                dec     ecx
                jmp     loc_4011D5


loc_4010FC:
                cmp     ecx, 20h
                jb      short loc_401130
                and     ecx, 1Fh
                test    ecx, ecx
                jnz     short loc_401120
                jmp     short loc_401111


loc_40110A:
                add     ecx, 0FFh
                inc     esi

loc_401111:                             ; CODE XREF: start+108j
                cmp     byte ptr [esi], 0
                jz      short loc_40110A
                xor     eax, eax
                mov     al, [esi]
                add     eax, 1Fh
                add     ecx, eax
                inc     esi

loc_401120:                             ; CODE XREF: start+106j
                movzx   ebx, word ptr [esi]
                sar     ebx, 2
                lea     eax, [edx-1]
                sub     eax, ebx
                add     esi, 2
                jmp     short loc_401199


loc_401130:                             ; CODE XREF: start+FFj
                cmp     ecx, 10h
                jb      short loc_40117A
                mov     eax, edx
                mov     ebx, ecx
                and     ebx, 8
                shl     ebx, 0Bh
                sub     eax, ebx
                and     ecx, 7
                test    ecx, ecx
                jnz     short loc_401160
                jmp     short loc_401151


loc_40114A:                             ; CODE XREF: start+154j
                add     ecx, 0FFh
                inc     esi

loc_401151:
                cmp     byte ptr [esi], 0
                jz      short loc_40114A
                xor     ebx, ebx
                mov     bl, [esi]
                add     ebx, 7
                add     ecx, ebx
                inc     esi

loc_401160:
                movzx   ebx, word ptr [esi]
                sar     ebx, 2
                sub     eax, ebx
                add     esi, 2
                cmp     edx, eax
                jz      loc_40120D
                sub     eax, 4000h
                jmp     short loc_401199


loc_40117A:
                shr     ecx, 2
                lea     eax, [edx-1]
                sub     eax, ecx
                xor     ecx, ecx
                mov     cl, [esi]
                inc     esi
                shl     ecx, 2
                sub     eax, ecx
                mov     cl, [eax]
                inc     eax
                mov     [edx], cl
                inc     edx
                mov     al, [eax]
                mov     [edx], al
                inc     edx
                jmp     short loc_4011EA


loc_401199:
                cmp     ecx, 6
                jb      short loc_4011D5
                mov     ebx, edx
                sub     ebx, eax
                cmp     ebx, 4
                jl      short loc_4011D5
                mov     ebx, [eax]
                add     eax, 4
                mov     [edx], ebx
                add     edx, 4
                sub     ecx, 2

loc_4011B4:
                mov     ebx, [eax]
                mov     [edx], ebx
                add     edx, 4
                add     eax, 4
                sub     ecx, 4
                cmp     ecx, 4
                jnb     short loc_4011B4
                test    ecx, ecx
                jbe     short loc_4011EA

loc_4011CA:
                mov     bl, [eax]
                inc     eax
                mov     [edx], bl
                inc     edx
                dec     ecx
                jnz     short loc_4011CA
                jmp     short loc_4011EA


loc_4011D5:
                mov     bl, [eax]
                inc     eax
                mov     [edx], bl
                inc     edx
                mov     bl, [eax]
                inc     eax
                mov     [edx], bl
                inc     edx

loc_4011E1:
                mov     bl, [eax]
                inc     eax
                mov     [edx], bl
                inc     edx
                dec     ecx
                jnz     short loc_4011E1

loc_4011EA:
                xor     ecx, ecx
                mov     cl, [esi-2]
                and     ecx, 3
                test    ecx, ecx
                jz      loc_40103C

loc_4011FA:
                mov     al, [esi]
                inc     esi
                mov     [edx], al
                inc     edx
                dec     ecx
                jnz     short loc_4011FA
                xor     ecx, ecx
                mov     cl, [esi]
                inc     esi
                jmp     loc_4010D7


loc_40120D:
                sub     edx, [ebp+10h]
                mov     eax, [ebp+14h]
                mov     [eax], edx
                cmp     esi, [ebp-4]
                jnz     short loc_40121E
                xor     eax, eax
                jmp     short loc_40122B


loc_40121E:
                mov     eax, 0FFFFFFF8h
                cmp     esi, [ebp-4]
                jb      short loc_40122B
                add     eax, 4

loc_40122B:
                pop     esi
                pop     ebx
                pop     ecx
                pop     ebp
                retn
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 26.04.2013 в 07:54.
Ответить с цитированием
  #7  
Старый 26.04.2013, 07:49
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Кажется начинает доходить
Код:
procedure DecompressData(const InData: Pointer; InSize: LongInt; const OutData: Pointer; var OutSize: LongInt);
OutSize объявлена как var, а ей передается константная, на момент выполнения, переменная Ms.size. Я так понимаю, OutSize показывает размер на выходе потока, т.е. разжатого файла, может нужно просто отдельную переменную туда передать?

З.Ы.
Цитата:
В моем случае применяется быстродейственный алгоритм LZO!!!
Это основной алгоритм сжатия архиватора 7Zip.

Последний раз редактировалось Alegun, 26.04.2013 в 07:54.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:49.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter