PDA

View Full Version : سوال: الگوريتم رمزنگاري که باعث کوتاه شدن رشته شود



عقاب سیاه
چهارشنبه 13 بهمن 1389, 16:38 عصر
آيا امکان دارد يک رشته ي 20 تا 30 رقمي با حرفي(عدد يا حروف) را با الگوريتم برگشت پذيري کد کنيم و باعث شود که اين رشته ي کد شده از خود رشته ي اصلي کوتاه تر باشد و براي مثال رشته ي 30 رقمي ما 5 يا 6 رقمي شود.(ترجيحا خروجی فقط عدد باشد)

BORHAN TEC
چهارشنبه 13 بهمن 1389, 18:04 عصر
از کلاسهای موجود در یونیت Zlib استفاده کنید. قبلاً هم مثالی در سایت قرار گرفته بود. همچنین برای کسب اطلاعات بیشتر می توانید به کتاب Mastering Delphi 7 مراجعه کنید.

عقاب سیاه
پنج شنبه 14 بهمن 1389, 11:57 صبح
سلام
خيلي ممنون
با اين کد string را کد مي کنم اما نتيجه را چه طور مي تونم نمايش بدم به کاربر (توي يک edit) ؟؟
zlib.ZCompressStr(edit1.Text,zcMax);

عقاب سیاه
پنج شنبه 14 بهمن 1389, 19:59 عصر
سلام
این کد را که از آقای کشاورز است را جستم:
function BytesToHex(const Bytes: TBytes): string;
var
i : integer;
begin
for i := 0 to Length(Bytes)-1 do
Result := Result + IntToStr(Bytes[i);
end;

عقاب سیاه
پنج شنبه 14 بهمن 1389, 20:56 عصر
سلام دوباره :گریه:

با این روش که کد 4 رقمی میشه 12 رقم!!! :قهقهه: :متعجب:

تو را به خدا کمک !! :ناراحت:
http://s27.aks98.com/images/93627263750892441171.png

Mask
یک شنبه 17 بهمن 1389, 17:50 عصر
عزیز دل برادر.
موضوع اینه که کلا عنوان سوال شما اشتباهه
چرا؟
چون زمانی که یه استرینگ با الگوریتم های آماده رمز نگاری میشه مطمئنا طولش زیاد میشه.
حالا اگه بخاهی این طور نباشه خودت باید الگوریتم بنوییسی.
به طور مثال :
یه الگوریتم ساده رو مثال میزنم.
شما تصور کن یه استرینگ داری به شکل 123456789
حالا میخای اینو رمز نگاری کنی...
میای و به معادلش در کلمات انگلیسی تبدیل میکنی که میشه...
abcdefghi
حالا با چنتا شرط میتونی طولش رو کمتر هم بکنی.

eshpilen
یک شنبه 17 بهمن 1389, 19:21 عصر
اینکه شما میگی رمزنگاری نیست، فشرده سازی هست.
اگر بخواید میتونید اول فشرده کنید و بعدش رمزگذاری.

lord_viper
دوشنبه 18 بهمن 1389, 08:55 صبح
حداقلش میتونی اعداد رو با مثلا 32 عمل xor انجام بدی اینجوری شاید تعداد اعداد کم یا زیاد نشه ولی طولش بیشتر نمیشه و اطلاعاتت هم رمز میشه
در ضمن رمز نگاری و فشرده سازی 2 مقوله جدا از هم هست

عقاب سیاه
دوشنبه 18 بهمن 1389, 16:06 عصر
از پاسخ ها خیلی خیلی ممنون! :لبخند:
حالا اکه من فقط بخواهم تعدای حرف یا عدد را مثلا 20 یا 30 رقمی را به 5 تا 10 رقم برسونم که قابل برگشت باشه باید چی کا کنم؟؟؟؟ :متعجب:



اگر بخواید میتونید اول فشرده کنید و بعدش رمزگذاری.
فکر کنم این کار خیلی بهتر باشد اگه موفق به فشرده سازی بشم!


میای و به معادلش در کلمات انگلیسی تبدیل میکنی که میشه...
دقیقا می خوام برای رشته ی کوتاه شدم از همین روش اسنفاده کنم . برای هر عدد یک حرف انتخاب کنم (یا برعکس) این طوری رشته هم کد شده و کوتاه


با سپاس فراوان از همه دوستان

عقاب سیاه
سه شنبه 19 بهمن 1389, 16:11 عصر
اصلا دلفی همچین امکانی دارده؟
یعنی می شه این کا را در دلفی کرد؟؟؟؟؟

(فردا میشه یک هفته) تو را به خدا یکی کمک کنه!!!!!!!!!!!!!!!!!!!!

lord_viper
سه شنبه 19 بهمن 1389, 18:12 عصر
توصیه ای که به شما میشه کرد اینه که اول تو بخش الگوریتم سری به روش کار الگوریتمهای فشرده سازی (مثلا هافمن)بزنید تا کمی روش کار دستتون بیاد بعد خودتون متوجه میشید ایا میشه این الگوریتمها رو برای 20-30کاراکتر پیاده سازی کرد یا خیر

eshpilen
سه شنبه 19 بهمن 1389, 19:35 عصر
اگر فقط کاراکترهای عددی باشه، مثلا میشه تا مقدار 255 رو توی یک بایت ذخیره کرد. 255 بصورت رشته ای سه بایت رو اشغال میکنه، اما بصورت باینری در یک بایت میشه ذخیرش کرد. پس شما میتونی کل رشتهء عددی رو از حالت اسکی به باینری تبدیل کنی و با این کار فشرده سازی قابل توجهی داشته باشی. بعد شاید بتونی تازه از روشهای دیگر فشرده سازی هم روش استفاده کنی. یعنی اگر ارقام تکراری زیاد داشته باشی.

عقاب سیاه
جمعه 22 بهمن 1389, 13:41 عصر
ببخشید من که مثالی برای هافمن تو دلفی پیدا نکردم
اما تو الگوریتم ها این چیزی که فهمیدم برای تعداد 20 یا 30 رقم کار آمد نیست.

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

خوب من که گفتم قابل برگشت باشه! فکر نکنم بعد بشه این بایت ها را به متن اصلی برگردوند!


خیلی ممنون از پاسخهاتون

eshpilen
شنبه 23 بهمن 1389, 09:34 صبح
خوب من که گفتم قابل برگشت باشه! فکر نکنم بعد بشه این بایت ها را به متن اصلی برگردوند!

چرا نمیشه؟
شما هر عددی رو که بصورت رشته ای باشه میتونی بصورت باینری دربیاری و بعکس.
اصلا مگر اون رشتهء کاراکتری خودش انکدینگ دیگری از یک عدد نیست؟
البته این به شرطی هست که توی رشتهء شما بجز کاراکترهای رقمی کاراکتر دیگه ای نباشه. چون اگر باشه اونوقت به راهی نیاز هست که میان مقدار کاراکترهای عددی و غیرعددی تمیز داده بشه.

mbshareat
شنبه 23 بهمن 1389, 19:41 عصر
با سلام
به نظر من شما اگه فقط از عدد استفاده می کنین هر عدد رو تو نیم بایت می تونین جا بدین چون کلا حالتهای عددهای هر رقم ده تا بیشتر نیست(0..9).می تونین کد اسکی هر کارکتر عددی رو منهای 48 کنین و هر دو کارکتر عددی رو تو کارکتر اسکی بریزین. و اگه تعداد کارکترهاتون زوج نبود آخرش یه کارکتر مثلا A بذارین.
(نمی دونم این هم روشه که گفتم یا کاملا بی ربطه در صورت من هم مبتدیم!)

mohammadian7
شنبه 23 بهمن 1389, 20:23 عصر
سلام
کد هافمن هم فکر کنم این کار رو انجام بده

عقاب سیاه
یک شنبه 24 بهمن 1389, 17:25 عصر
من که هرکاری که کردم نشد!
می شه خودتون به مثال بزارید!
سپاس

mbshareat
یک شنبه 24 بهمن 1389, 17:56 عصر
سلام
می تونین اعداد رو دوتادوتا بگیرین و هر دو کارکتر رو ('00'..'99') معادل از نوع Char براش بدست بیارین مثلا معادل رشته '65' میشه 'A' (البته بزرگ و کوچیکش رو نمی دونم) بذارین

eshpilen
یک شنبه 24 بهمن 1389, 18:46 عصر
من که هرکاری که کردم نشد!
می شه خودتون به مثال بزارید!
سپاس
کدوم روش رو میگید؟

عقاب سیاه
یک شنبه 24 بهمن 1389, 22:29 عصر
کدوم روش رو میگید؟

واقعا ممنون از لطفتون
همون روشی را که خودتون در بالا نوشتید!

یا اگه سایر دوستان روشی پیشنهاد می کنند، کدی که عملیات مورد نظرشون را انجام بده هم بگذارند!




سلام
می تونین اعداد رو دوتادوتا بگیرین و هر دو کارکتر رو ('00'..'99') معادل از نوع Char براش بدست بیارین مثلا معادل رشته '65' میشه 'A' (البته بزرگ و کوچیکش رو نمی دونم) بذارین

خیلی ممنون ولی این روش بخاطر بزرگ و کوچک شدن حروف برای مقصودی که من می خواهم چندان مناسب نیست و کاربر را به دردسر می اندازد و البته در فشرده سازی هم چندان زیاد نیست!( مخصوصا وقتی o ,O , 0 این حروف و اعداد را کاربر بخواهد از طریق پیامک برای فروشنده بفرسد.)


از همه به خاطر توجه و پاسخ ها کمال تشکر را دارم