PDA

View Full Version : مشکل در پیاده سازی الگوی فشرده سازی



CSharp-Assistant
یک شنبه 26 تیر 1384, 23:16 عصر
با سلام !!
من برای یک برنامه از یه الگوی فشرده سازی ساده استفاده کردم الگوی کامپرس کردن رو درست نوشتم به طوری که به درستی کارش رو انجام میده اما الگوی دیکد کردن ........ من از الگوی RLE یا Run Length Encoding استفاده کردم که در آن حروف تکرای پشت سر هم به این صورت فشرده میشه که ابتدا تعداد دفعات تکرار رشته به همراه رشته در آن نوشته میشه مثلا :
AAAAAAAAAA میشه 10A خب حالا با این تعاریف من یک متد سادهبرای انکود کردن آن بدین صورت نوشتم که به هر حال کار خودش رو درست انجام میده :

private string looped;//Dim looped() As String (Char Hayeh Tekrary!!!)
private string sh;

public string RLE(string str)
{
sh=null;
looped=str[0].ToString();
int len=str.Length;//Dim len As Integer=Len(str2)
char lastchr;//Dim lastchr As String
try
{
for(int b=1;b!=str.Length;b++)//For b=1 To Len(str2(i)
{
lastchr=str[b-1];
if(lastchr==str[b])
{
looped=looped+str[b];
}
else if(lastchr!=str[b])
{
looped+="|";
looped=looped+str[b];
}
}//End For
string[]after=looped.Split("|".ToCharArray());
for(int i=0;i!=after.Length;i++)
{
sh+=after[i].Length.ToString()+after[i].Substring(0,1);
}
//sh=sh.Replace("|","");
}
catch(System.Exception ea)
{
MessageBox.Show(ea.Message);
}
return sh;
}


الگوی دیکد رو ولی هنوز نتونستم کامل کنم البته یه چیز هایی نوشتم که فکر نکنم اصولی باشه !!! {چون کارش رو درست انجام نمیدهد} حال می خواستم در باره چگونه دیکد کردن رشته هایی که این الگو به ما بر می گرداند یه توضیح کوتاهی بدهید !!
در صورتی که مایل بودید متد دیکامپرسی که در بالا به آن اشاره کردم هم براتون می گذارم !!!
منتظر پاسخ شما هستم

EhsanKhafan
دوشنبه 27 تیر 1384, 08:43 صبح
خوب معلومه در دیکد کردنش به مشکل میخوری نگاه کن:
ورودی برنامه کدر تو اگر 103aaaa باشه خروجیت میشه: 1034a خوب اگه ورودی برای دیکد کردن 1034a باشه دیکدش چی میشه؟؟(1034 تا A؟ یا . . .)
باید یجوری معین کنی که 4 فقط برای تعداد است و 103 یک عدد داخل رشته است.از یک دلیمیتر(فارسیش فکر کنم میشه مرز نگه دار ،حائل ) استفاده کن

CSharp-Assistant
دوشنبه 27 تیر 1384, 10:28 صبح
همین دیگه مشکل کلی این الگوریتم مشکلل اعداد وکدو دیکد کردن آن هاست که البته در کاری که قراره انجام بدم زیاد از اعداد استفاده نمیشه برای همین زیاد مهم نیست ولی مشکل اصلی من در کل دیکد کردن روشی که من برای دیکد استفاده می کنم اینه :
ابتدا یه فیلد از نوع آرایه رشته ای در نظر می گیرم و با یه چرخه اعداد بین 1 تا int.MaxValue در این آرایه میریزم.
بعد میام با چرخه در آرایه اعداد تکت تکت رشته ها رو مقایسه می کنم که آیا عدد هستند یا نه !! بعد اگه عدد بودند میام یه چرخه دیگه می ذارم که به تعداد اون عدد که با Convert.ToInt32 اونا رو به عدد تبدیل کردم اون هارو تکرار می کنم ولی در زمان دستور شرطی برنامه یه استثنا براش پیش میاد و و می پره بیرون !!! حالا به نظر شما از چه روشی باید استفاده کنم که این مشکل بوجود نیاد ؟؟؟؟؟

CSharp-Assistant
دوشنبه 27 تیر 1384, 22:29 عصر
یعنی سوال سخت خیلی دور از دسترسی پرسیدم ؟؟؟؟؟؟