01-09-2013, 05:54 PM
virtual كتب :وجدت الحل .
يجب عليك ان تخزن قيمة حجم الملف الغير مضغوط اولا , داخل الملف المضغوط او في مكان اخر
عند فك الضغط استخرج هذه القيمة و احجز بها ذاكرة ل OutData , ثم استخدم الدالة DecompressData
بالفعل لقد نجحت في فك التشفير ..
لقد قمت بكتابة دالتين جاهزتين لتشفير و فك ملف .
دالة التشفير تقوم بحفظ حجم الملف الأصلي في آخر الملف بطول 4 بايت :
PHP كود :
{ => LZOCompressFile & LZODeCompressFile routines By SMP3 <= }
function LZOCompressFile(inFile, OutFile: PChar): LongInt;
var
P, Buffer: Pointer;
hFile: THandle;
FileSize: DWORD;
BRW: DWORD;
OutSize: integer;
function CompressData(const InData: Pointer; InSize: LongInt;
out OutData: Pointer; out OutSize: LongInt): LongInt;
var
WorkBuf: array [Word] of Byte;
begin
FillChar(WorkBuf, SizeOf(WorkBuf), 0);
OutSize := InSize + ((InSize div 1024) + 1) * 16;
OutData := GetMemory(OutSize);
Result := lzo_compress(InData^, InSize, OutData^, OutSize, WorkBuf);
end;
begin
Result := -1;
hFile := CreateFile(inFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if hFile <= 0 then
Exit;
FileSize := GetFileSize(hFile, 0);
GetMem(P, FileSize);
ReadFile(hFile, P^, FileSize, BRW, 0);
Result := CompressData(P, FileSize, Buffer, OutSize);
FreeMem(P, FileSize);
CloseHandle(hFile);
hFile := CreateFile(OutFile, GENERIC_WRITE, FILE_SHARE_READ or
FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if hFile <= 0 then
begin
Result := -1;
Exit;
end;
WriteFile(hFile, Buffer^, OutSize, BRW, 0);
Result := OutSize;
{ Set the cursor to last byte }
SetFilePointer(hFile, 0, 0, soFromEnd);
{ Write the Original file Size }
WriteFile(hFile, FileSize, 4, BRW, 0);
CloseHandle(hFile);
end;
function LZODeCompressFile(inFile, OutFile: PChar): LongInt;
var
P, Buffer: Pointer;
hFile: THandle;
FileSize: DWORD;
BRW: DWORD;
OutSize, OrgFileSize: integer;
begin
Result := -1;
hFile := CreateFile(inFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if hFile <= 0 then
Exit;
FileSize := GetFileSize(hFile, 0);
if FileSize <= 0 then
Exit;
Dec(FileSize, 4); { Get compressed file size }
GetMem(P, FileSize);
ReadFile(hFile, P^, FileSize, BRW, 0);
{ Get Original File Size }
SetFilePointer(hFile, -4, 0, soFromEnd);
ReadFile(hFile, OrgFileSize, 4, BRW, 0);
GetMem(Buffer, OrgFileSize);
lzo_decompress(P^, FileSize, Buffer^, OutSize);
FreeMem(P, FileSize);
CloseHandle(hFile);
{ Save File to Disk }
hFile := CreateFile(OutFile, GENERIC_WRITE, FILE_SHARE_READ or
FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if hFile <= 0 then
begin
Result := -1;
FreeMem(Buffer, OrgFileSize);
Exit;
end;
WriteFile(hFile, Buffer^, OutSize, BRW, 0);
CloseHandle(hFile);
Result := OrgFileSize;
FreeMem(Buffer, OrgFileSize);
end;
Open Your Source .. Open Your Mind

