کمپرس اطلاعات

آذر ۱۹م, ۱۳۸۸

خیلی پیش میاید که یک برنامه نویس نیاز به کمپرس کردن اطلاعات داشته باشد. مواقعی نظیر پشتیبان گرفتن از اطلاعات یا مثلا وقتی که برنامه نویس دیتابیس میخواهد یک فیلد Blob بزرگ را در یک بانک ذخیره کنید. (مثلا زمانی که نیاز دارید یک Bitmap را به عنوان یک فیلد ذخیره کنید و نمیخواهید با تبدیل آن به Jpg یا هر نوع دیگری قسمتی از آن را از دست بدهید.

برای اینکار میتوانید از متد های کمپرس کردن اطلاعات بدون تلفات استفاده کنید. در این کتابخانه (که شما میتوانید آن را از پایین همین صفحه بگیرید دو متد کمپرس کردن اطلاعات پیاده سازی شده است. نخست ZLIB و دیگری BZIP.

البته دقت کنید که هر دو متد در اصل به زبان سی هستند و با استفاده از قابلیت ویژه دلفی در مورد استفاده از کد سی در دلفی ،در دلفی استفاده شده اند.

متد کمپرس zlib

این متد قدیمیترین و یکی از پر استفاده ترین آنهاست. این متد در حال حاضر جزیی از Linux شده و در PHP و خیلی دیگر از برنامه ها کاملا پشتیبانی میشود. نویسنده کد C مربوط به آن Jean-loup Gailly و Mark Adler هستند. این کد Open Source و لیسانس کاملا آزادی دارد. علاوه بر آن تصاویر PNG )Portable network graphic)هم از این متد برای کمپرس کردن چانک های تصویر استفاده میکند.فایل های gz و tgz نیز با این متد کمپرس شده اند.

این متد در دلفی به صورت عادی پیاده سازی شده است ولی نقایص این پیاده سازی باعث شد که دوباره آنها را بنویسم. این نقایص عبارتند از :

  1. قابلیت حذف هدر ZLIB در نسخه بورلند نیست بنابراین امکان پیاده سازی کمپرس و دکمپرس به / از فایلهای GZ نیست.
  2. متد OnProgress تعداد بیتهای کمپرس شده را بر نمیگرداند.
  3. نسخه مورد استفاده در دلفی 1.0.4 است ،نه نسخه فعلی آن 1.2,3

این دلایل خصوصا دلیل اول مرا بر آن داشت تا خودم دست بکار شوم و این کد را دوباره بنویسم.

متد کمپرس BZip

این متد از لحاظ پیاده سازی شباهت بسیار زیادی به ZLIB دارد. کد سی آن را Julian R Seward نوشته است. نسخه هایی از این کتابخانه برای دلفی وجود دارد که از BZip.dll استفاده میکنند. (برای نمونه Inno Setup از این کد با کمک دو دی ال ال استفاده میکند. )این روش باعث میشود شما مجبور به انتشار این دو دی ال ال (یا نهایتا یکی ) همراه برنامه خود شوید که چندان خوشایند نیست.
اما این کتابخانه کد BZip را کامپایل و آن را در برنامه لینک میکند و دیگر نیازی به هیچ فایل خارجی نیست.

برخلاف متد ZLIB این متد خود بخود فایل BZIP را ایجاد میکند و شما نیازی ندارید که مثل فایل GZ آن را خودتان درست کنید.

توضیحات مربوط به کتابخانه

این کتابخانه شامل 7 کلاس مشتق از TStream و سه کلاس مشتق از Exception است که عبارتند از

  • Exception
    • ECompException
      • EBZException
      • EZException
  • TStream
    • TCompStream
      • TCustomeCompressor
        • TBZCompressor
        • TZCompressor
      • TCustomeDecompressor
        • TBZDeCompressor
        • TZDeCompressor

کلاس TCompStream که کلاس پایه برای همه کلاسهای دیگر است. کلاس TCustomeCompressor که پایه تمام کلاسهای مربوط به کمپرس کردن اطلاعات است و کلاس TCustomeDecompressor که کلاس پایه دکمپرس محسوب میشود.
باقی کلاسها ، آنها که با Z شروع میشوند (گذشته از حرف T برای کلاسها و E برای Exception ها) مربوط به ZLIB و آنها که با BZ شروع میشوند مربوط به BZip هستند.

دو تابع ساده برای کمپرس و دکمپرس اطلاعات به / از فایل GZ وجود دارند که میتوانید از آنها استفاده کنید البته با توجه به اینکه این دو تابع صرفا برای استفاده شخصی و فوق العاده ساده نوشته شده اند.

مثال همراه برنامه برای استفاده از این کتابخانه بسیار مفید است. این انتشار، شامل سه rfc به شماره های 1950 تا 1952 هم هست .

دانلود

این کتابخانه به صورت کد باز و در سایت SourceForge قرار داده شده. میتوانید نسخه پایدار فعلی را از اینجا دانلود کنید.
برای گرفتن نسخه فعلی (که ممکن است شامل تغییراتی نسبت به نسخه پایدار باشد که هنوز در آن ادغام نشده یا اینکه هنوز تصمیم به ادغام آن گرفته نشده) از آدرس SVN زیر استفاده کنید :

https://delphi-computil.svn.sourceforge.net/svnroot/delphi-computil