MiniZlib نسخة مصغرة من مكتبة ZLib
#1
السلام عليكم و رحمة الله و بركاته
أضططرت لاستخدام مكتبة ZLib في مشروع مبني على Win32 Api فقط (بدون ال Vcl)
لكن للأسف مكتبة ZLib تحتوي على استدعاء لكلاسات دلفي Vcl (حجم كبير للملف الناتج)
لذلك قمت بالتعديل على المكتبة حتى تعمل بدون مكتبة ال VCL => حجم صغير !!
تم تجربتها على دلفي 7 & دلفي XE4


الملفات المرفقة
.rar   MiniZLib.rar (الحجم : 78.28 ك ب / التحميلات : 125)
Open Your Source .. Open Your Mind
[-] كل من 2 users say قال شكرا ل SMP3 على المشاركة المفيدة
  • mohamed49, haniid
الرد
#2
شكرا على مشاركة الكود

تستطيع استخدام LZO بدل zlib , ستحصل على حجم تطبيق أقل .
معدل الضغط في zlib اكبر بقليل من lzo , لكن الاخيرة اسرع بكثير .

كود :
function lzo_compress(const Data; Size: LongInt; var CData; var CSize: LongInt; var WorkBuf): LongInt; cdecl; asm {$IFDEF WIN32} jmp lzo_compress + $2F0 + 8 + 3 {$ELSE} pop ebp lea eax, @dest + $2F0 jmp eax @dest: {$ENDIF} DD $83EC8B55,$5653E8C4,$C458B57,$308558B,$FC5589D0,$89F3C283,$458BF855,$F4458918,$8B10558B DD $F08B0845,$3304C083,$8ADB33C9,$588A0348,$6E1C102,$DB33CB33,$8A05E1C1,$CB330158,$E1C1DB33 DD $33188A05,$C1D98BCB,$CB0305E1,$8105E9C1,$3FFFE1,$EC4D8900,$8BF44D8B,$C8BEC5D,$3BD98B99 DD $7E72085D,$FB2BF88B,$85F07D89,$817376FF,$BFFFF07D,$6A770000,$F07D81,$76000008,$3598A51 DD $7403583A,$EC4D8B49,$7FFE181,$F1810000,$201F,$8BEC4D89,$5D8BF44D,$990C8BEC,$5D3BD98B DD $8B377208,$89FB2BF8,$FF85F07D,$7D812C76,$BFFFF0,$81237700,$800F07D,$A760000,$3A03598A DD $2740358,$8B6610EB,$183B6619,$598A0875,$2583A02,$4D8B1874,$EC5D8BF4,$40990489,$FF8453B DD $1D883,$FF25E900,$5D8BFFFF,$EC7D8BF4,$8BBB0489,$85DE2BD8,$89567EDB,$7D83E85D,$87703E8 DD $8E85D8A,$3AEBFE5A,$12E87D83,$5D8A0B77,$3EB80E8,$EB421A88,$E87D8B29,$420002C6,$8112EF83 DD $FFFF,$81127600,$FFEF,$2C600,$FFFF8142,$77000000,$88DF8BEE,$1E8A421A,$421A8846,$75E84DFF DD $3C083F5,$4003598A,$75FF583A,$4598A2D,$FF583A40,$598A2475,$583A4005,$8A1B75FF,$3A400659 DD $1275FF58,$4007598A,$75FF583A,$8598A09,$FF583A40,$8B487674,$81CE2BC8,$800F07D,$F18B0000 DD $4DFF2577,$49CE8BF0,$8A05E1C1,$E380F05D,$2E3C107,$A88CB0A,$F04D8B42,$8803E9C1,$F2E9420A DD $81000000,$4000F07D,$13770000,$8BF04DFF,$2E980CE,$8820C980,$C1E9420A,$81000000,$4000F06D DD $4D8B0000,$81DE8BF0,$4000E1,$2EB8000,$800BE9C1,$CB0A10C9,$E9420A88,$9C,$83FC7D8B,$2EB09C1 DD $F83B4041,$198A0676,$F474183A,$CE2BC88B,$7D81F18B,$4000F0,$FF1E7700,$FE83F04D,$8B0D7721 DD $2E980CE,$8820C980,$64EB420A,$C621EE83,$EB422002,$F06D813C,$4000,$7709FE83,$F04D8B1B DD $E181DE8B,$4000,$C102EB80,$C9800BE9,$88CB0A10,$34EB420A,$8B09EE83,$E181F04D,$4000 DD $800BE9C1,$A8810C9,$FFFE8142,$76000000,$FFEE8112,$C6000000,$81420002,$FFFE,$8BEE7700 DD $420A88CE,$80F04D8A,$E1C13FE1,$420A8802,$C1F04D8B,$A8806E9,$3BF08B42,$573F845,$FFFD52E9 DD $10552BFF,$8914458B,$FC458B10,$5E5FC62B,$5DE58B5B,$909090C3,$53EC8B55,$758B5756,$C7D8B10 DD $FF83DE8B,$8B04770D,$8B1BEBC7,$8B521855,$5351144D,$8458B57,$FCE6E850,$C483FFFF,$14558B14 DD $C0851A03,$4D8B6676,$2BCF0308,$8BF33BC8,$3D1175F9,$EE,$D08B0A77,$8811C280,$3FEB4313 DD $7703F883,$FE430805,$F88335EB,$8B0A7712,$3E980C8,$EB430B88,$C6D08B26,$83430003,$FA8112EA DD $FF,$EA811276,$FF,$430003C6,$FFFA81,$EE770000,$8A431388,$B88470F,$F7754843,$431103C6,$430003C6 DD $430003C6,$458BDE2B,$33188914,$5B5E5FC0,$9090C35D end; 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 CompressData(const InData: Pointer; InSize: LongInt; out OutData: Pointer; out OutSize: LongInt); var WorkBuf : array [Word] of Byte; begin FillChar(WorkBuf, SizeOf(WorkBuf), 0); OutSize := InSize + ((InSize div 1024) + 1) * 16; OutData := GetMemory(OutSize); lzo_compress(InData^, InSize, OutData^, OutSize, WorkBuf); end; procedure DecompressData(const InData: Pointer; InSize: LongInt; const OutData: Pointer; var OutSize: LongInt); begin lzo_decompress(InData^, InSize, OutData^, OutSize); end;
[-] كل من 1 user says قال شكرا ل virtual على المشاركة المفيدة
  • mohamed49
الرد
#3
شكرا أخي virtual على الدالة !!!
لماذا قام صاحبها بكتابتها بال opcode ؟
أمر محير ...
لقد قمت بتجربتها لكني صادفت العديد من المشاكل معها في فك الضغط
تم ضغط ملف بنجاح لكني لم أتمكن من فك ضغطه (لا أعلم السبب !! )
هل يوجد لديك مثال لاستخدامها ؟
Open Your Source .. Open Your Mind
الرد
#4
السلام عليكم
إقتباس :لماذا قام صاحبها بكتابتها بال opcode ؟
من الفرنسي Arnaud Bouchez
صغر الحجم وسرعة التحميل + المحولية! تعمل على Win32 و Linux
كود :
http://bouchez.info/lzo.html
التحويل الى باسكال فقط ألق نظرة على SynLZ نفس الرابط

ايضا موضوع: ضغط الملفات بصيغة zip في الدلفي

لخواريزميات اخرى غير zip ابحث بموقع KOL/MCK القديم تجد به امثلة بحجم صغير وغير متعلقة بالVCL
[-] كل من 1 user says قال شكرا ل محمد عبد العزيز على المشاركة المفيدة
  • mohamed49
الرد
#5
إقتباس :صغر الحجم وسرعة التحميل + المحولية! تعمل على Win32 و Linux
ليس هناك دخل للسرعة أو المحمولية ..
أكواد الأسمبلي ستترجم مباشرة الى opCode
كتابته بال OpCode ==> عند الترجمة يتم تجاهل التحويل و يتم تضمينه مباشرة في الملف التنفيذي
لو فتحته ب Debuger ستجده على هيئة asm
عند عمل compiler للملف يتم تحويل أكواد الأسمبلي الى opcode (ان كانت بالفعل opcode سيتم تضمينها مباشرة => لا وجود لعملية التحويل)
عند فتح الملف exe بالمنقح يتم تحويل ال opcode الى أكواد أسمبلي
يعني كتابة الدالة بال opcode = كتابتها بال asm
هذا مثال بسيط يوضح الفكرة :
PHP كود :
function Sum1(a,b:Integer):Integer;
asm
   Call 
@End
   DW 0D001h   
{ADD EAX,EDX}
   @
End:
end;
function 
Sum2(a,b:Integer):Integer;
asm
  ADD EAX
,EDX
end
;
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1
.Text:= IntToStr(Sum1(5,10));
  
Edit2.Text:= IntToStr(Sum2(5,10));
end; 
[صورة: pIaiM.png]
---------------------------------------------
اعتقادي أن صاحب الخوارزمية يريد أن يتفلسف و يمنع المبرمجين من الاطلاع على السورس ..
Open Your Source .. Open Your Mind
[-] كل من 1 user says قال شكرا ل SMP3 على المشاركة المفيدة
  • mohamed49
الرد
#6
إقتباس :لخواريزميات اخرى غير zip ابحث بموقع KOL/MCK القديم تجد به امثلة بحجم صغير وغير متعلقة بالVCL
الموقع متوقف أخي B.M.AbdelAziZ ..
Open Your Source .. Open Your Mind
الرد
#7
عندك خق , الدالة لا تعمل عندي ايضا , بما ان جسم الدالة مكتوب بال opCode فمن الصعب ايجاد الخطأ
إقتباس :اعتقادي أن صاحب الخوارزمية يريد أن يتفلسف و يمنع المبرمجين من الاطلاع على السورس ..
ربما لديه سبب اخر , ممكن دعم نسخ دلفي القديمة

هذه نسخة بالباسكال
كود :
http://synopse.info/fossil/artifact/183eccf00c082dac5a9ed7aa0641a95864c5486c
الرد
#8
وجدت الحل .
يجب عليك ان تخزن قيمة حجم الملف الغير مضغوط اولا , داخل الملف المضغوط او في مكان اخر
عند فك الضغط استخرج هذه القيمة و احجز بها ذاكرة ل OutData , ثم استخدم الدالة DecompressData
الرد
#9
إقتباس :الموقع متوقف ...
امس كان يعمل! ربما تحديث او اختراق... ايا كان هناك دائما نسخة بمكان ما...
كود :
http://sourceforge.net/projects/keyobjectslibrary/files/Components/Compress/ http://www.mirrorservice.org/sites/downloads.sourceforge.net/k/ke/keyobjectslibrary/Components/Compress/
إقتباس :ليس هناك دخل للسرعة أو المحمولية ..
لم تصدق Big Grin مبرمجها موجود يمكن ان تساله عبر البريد او بمنتداه بsynopse
إقتباس :أكواد الأسمبلي ستترجم مباشرة الى opCode...
كتابة الدالة بال opcode = كتابتها بال asm
ليس تماما
عندما تكتبها بAsm أو حتى Pascal فان اختلاف الCompiler لا يعطي دائما نفس النتيجة (خواريزمية كاملة وليس فقط جمع Add)
انتبه هنا تعمل على Win32 و Linux وكما تعرف دلفي لا يعمل على Linux فماهو المترجم اذن Big Grin

عندما تكتب OpCode فانت تحصل على ما تريد/كما تريد/أينما تريد بعد الترجمة وهنا تبتعد عن مفاجئات الOptimization التي يقوم بها المترجم ضف امكانية استخدام Runtime معدل/مختلف !

ألق نظرة على Enhanced System Run Time for Delphi 7 and Delphi 2007
http://blog.synopse.info/post/2010/01/18...elphi-2007

إقتباس :اعتقادي أن صاحب الخوارزمية يريد أن يتفلسف و يمنع المبرمجين من الاطلاع على السورس ..
غالبا ما نقول يتفلسف عندما لا نفهم الزاوية التي ينظر منها الاخر... اما منع المبرمجين اطلاقا، لان اي مبرمج سبق له وان عمل Debugging لبرامجه ويكفي فتح الملف بمنقح ليراها بالAssembly أو يفتحها بIDA Pro ليشاهد مخطط للخواريزيمة والأهم هذا ليس شيئ سري بل مجرد تحويل لخواريمية مفتوحة المصدر بلغة الC لتعمل بمترجم باسكال ودلفي

حسن حتى ترى الزاوية الق نظرة على هذا
كود :
http://bouchez.info/delphi-bzip.html
نفس الخواريزمية بثلاث طرق، وبرأيك اي طريقة اسرع/اصغر Big Grin
[-] كل من 1 user says قال شكرا ل محمد عبد العزيز على المشاركة المفيدة
  • mohamed49
الرد
#10
على حد علمي مترجم دلفي او فري باسكال , لا يستطيع تحسين كود اسمبلي داخل دالة , فهو يبقيه كما هو .
حتى تعليمة inline لا تعمل اذا وجد سطر اسمبلي واحد فقط في دالة . في الاستدعاء ستجد call
[-] كل من 1 user says قال شكرا ل virtual على المشاركة المفيدة
  • mohamed49
الرد


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


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