PDA

View Full Version : مقاله: فشرده سازی با هافمن



shama2080
چهارشنبه 08 شهریور 1391, 14:15 عصر
سلام من یه برنامه نوشتم که هرنوع فایلی رو با کد هافمن فشرده کنه . بعد از این که کدهای صفر و یک مورد نظر تولید شد اونا رو تو یه فایل متنی میریزم (string)و برای decompress دوباره از فایل متنی میخوننه مشکلی که دارم اینه که حجم فایل متنی بیشتر از فایل اصلی میشه کسی میتونه کمکم کنه؟

Mahmoud.Afrad
چهارشنبه 08 شهریور 1391, 15:52 عصر
چرا در فایل متنی؟!!!!

شما در نظر بگیر هر صفر یا یک یک بیت هست، حالا اگر این عدد صفر یا یک را در فایل متنی ذخیره کنی تبدیل به کاراکتر میشه که هر کاراکتر حداقل یک بایت اشغال میکنه ، پس افزایش حجم صورت میگیره.


شما همون صفر و یک هایی که بدست میاد را با filestreame به صورت باینری ذخیره کن.

shama2080
چهارشنبه 08 شهریور 1391, 23:06 عصر
چرا در فایل متنی؟!!!!

شما در نظر بگیر هر صفر یا یک یک بیت هست، حالا اگر این عدد صفر یا یک را در فایل متنی ذخیره کنی تبدیل به کاراکتر میشه که هر کاراکتر حداقل یک بایت اشغال میکنه ، پس افزایش حجم صورت میگیره.


شما همون صفر و یک هایی که بدست میاد را با filestreame به صورت باینری ذخیره کن.
میشه کمی بیشتر توضیح بدین . برنامه من طوریه که این صفر و یک ها رو به صورت string تولید میکنه تا اون جایی که من میدونم برای ذخیره به صورت باینری با filestream باید آرایه ای از بایت ها داشته باشیم آیا راهی هست که بتونم این کاررو انجام بدم

the king
چهارشنبه 08 شهریور 1391, 23:39 عصر
میشه کمی بیشتر توضیح بدین . برنامه من طوریه که این صفر و یک ها رو به صورت string تولید میکنه تا اون جایی که من میدونم برای ذخیره به صورت باینری با filestream باید آرایه ای از بایت ها داشته باشیم آیا راهی هست که بتونم این کاررو انجام بدم

اگه خیلی تغییر دادن کدتون براتون مشکله همونجور نگهش دارید، فقط آخرش این 0 و 1 ها رو بصورت بایت در آورید :

string binary = "01100101100101011000111101100000";
if (binary.Length % 8 > 0)
binary = binary.PadRight((binary.Length / 8 + 1) * 8, '0');
byte[] bytes = new byte[binary.Length / 8];
for (int i = 0; i < bytes.Length; i++)
bytes[i] = Convert.ToByte(binary.Substring(i * 8, 8), 2);


و برعکس اش رو هم لابد برای کد گشایی لازم دارید :

byte[] bytes = new byte[] { 101, 149, 143, 96 };
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
sb.Append(Convert.ToString(bytes[i], 2).PadLeft(8, '0'));
string binary = sb.ToString();