MiniZlib نسخة مصغرة من مكتبة ZLib
#13
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; 
ملاحظة الدوال لا تعمل على bit 64
Open Your Source .. Open Your Mind
الرد


الردود في هذا الموضوع
MiniZlib نسخة مصغرة من مكتبة ZLib - بواسطة SMP3 - 31-08-2013, 03:28 PM
MiniZlib نسخة مصغرة من مكتبة ZLib - بواسطة virtual - 31-08-2013, 09:27 PM
MiniZlib نسخة مصغرة من مكتبة ZLib - بواسطة SMP3 - 01-09-2013, 12:23 AM
MiniZlib نسخة مصغرة من مكتبة ZLib - بواسطة SMP3 - 01-09-2013, 01:34 PM
MiniZlib نسخة مصغرة من مكتبة ZLib - بواسطة SMP3 - 01-09-2013, 01:47 PM
MiniZlib نسخة مصغرة من مكتبة ZLib - بواسطة virtual - 01-09-2013, 01:58 PM
MiniZlib نسخة مصغرة من مكتبة ZLib - بواسطة virtual - 01-09-2013, 05:24 PM
MiniZlib نسخة مصغرة من مكتبة ZLib - بواسطة SMP3 - 01-09-2013, 05:49 PM
MiniZlib نسخة مصغرة من مكتبة ZLib - بواسطة SMP3 - 01-09-2013, 05:51 PM
MiniZlib نسخة مصغرة من مكتبة ZLib - بواسطة SMP3 - 01-09-2013, 05:54 PM
MiniZlib نسخة مصغرة من مكتبة ZLib - بواسطة virtual - 01-09-2013, 02:22 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم