![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Помогите неразумному уже вторые сутки бьюсь и гуглил и что только не подставлял никак не могу разобраться: Нашел вот такой алгоритм:
Код:
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({Тут что только не подставлял...});
...Ну например Код:
DecompressData(Ms.Memory, Ms.size, Ms.Memory, Ms.size{Тут она ругается...});Последний раз редактировалось DrGeorg, 26.04.2013 в 07:02. |
|
#2
|
||||
|
||||
|
По ходу ms суётся и на вход и на выход? Наверное ещё один меморипоток нужен для выходного файла.
|
|
#3
|
|||
|
|||
|
Расскажите поподробней, Я даже делал так:
Код:
...
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
|
||||
|
||||
|
Цитата:
![]() З.Ы. Попробуйте вот это, может подойдёт. Последний раз редактировалось Alegun, 09.05.2013 в 12:19. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
DrGeorg (26.04.2013)
| ||
|
#5
|
|||
|
|||
|
Нет ZIP не подходит. У ZIP скорость (распаковки) маленькая! Для сравнения - LZO: 102 мб (300 мс), ZIP: 81 мб (1300 мс), LZMA: 61 мб (2400 мс). А у меня файл оч много весит...
И при чем тут: Цитата:
Последний раз редактировалось DrGeorg, 26.04.2013 в 07:49. |
|
#6
|
||||
|
||||
|
Именно ЛЗО нужен? Можно ЛЗМА взять (он довольно сильно жмет), он полностью на паскале есть.
И да, в блоке 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Последний раз редактировалось M.A.D.M.A.N., 26.04.2013 в 07:54. |
|
#7
|
||||
|
||||
|
Кажется начинает доходить
Код:
procedure DecompressData(const InData: Pointer; InSize: LongInt; const OutData: Pointer; var OutSize: LongInt); З.Ы. Цитата:
Последний раз редактировалось Alegun, 26.04.2013 в 07:54. |