স্ট্রিংকে ছোট করার জন্য আমি কী ধরণের এনকোডিং ব্যবহার করতে পারি?


13

আমি আমার কাছে থাকা একটি স্ট্রিং এনকোডিং করতে আগ্রহী এবং আমি আগ্রহী যদি এমন কোনও এনকোডিং থাকে যা ব্যবহার করা যেতে পারে যা কেবলমাত্র আলফা এবং সংখ্যাসূচক অক্ষরগুলিকে অন্তর্ভুক্ত করবে এবং স্ট্রিংটি উপস্থাপনের জন্য প্রয়োজনীয় অক্ষরের সংখ্যাটি সংক্ষিপ্ত করে তুলবে।

এখন অবধি আমি এটি করতে বেস 64 এনকোডিংটি ব্যবহার করে দেখেছি তবে এটি আমার স্ট্রিংটি দীর্ঘায়িত করে এবং মাঝে মাঝে ==যা এড়াতে চাই তা অন্তর্ভুক্ত করে । উদাহরণ:

পরীক্ষার নাম | 120101

হয়ে

dGVzdCBuYW1lfDEyMDEwMQ ==

যা ১ to থেকে ২৪ টি অক্ষর পর্যন্ত চলে এবং এতে অ-অক্ষরীয় থাকে।

কেউ কি অন্যরকম এনকোডিংয়ের কথা জানেন যা আমি ব্যবহার করতে পারি যা আমার প্রয়োজনীয়তা অর্জন করবে? বোনাস পয়েন্ট যদি তা হয় .NET ফ্রেমওয়ার্কে অন্তর্নির্মিত হয় বা তৃতীয় পক্ষের লাইব্রেরি রয়েছে যা এনকোডিংটি করবে।


1
হাফম্যান কোডিংয়ের মতো হ্রাস কম সংক্ষেপণ ব্যবহার করতে পারে না !! এগুলি আদর্শভাবে পাঠ্যগুলির পক্ষে উপযুক্ত ... তবে শেষের পরে আপনি পাঠ্যটি ফিরে পাওয়ার জন্য বাস্তবে এই পরিবর্তনটি আপনার সম্পর্কে জানা উচিত।

6
আপনি সংক্ষেপণের বর্ণনা দিচ্ছেন, এনকোডিং নয়
অ্যান্ডি স্মিথ

@ এন্ড্রু - ঠিক আছে, কোন পরামর্শ?
আবে মিজসেলার

উত্তর:


30

বেস 64 এ চূড়ান্ত '=' বা '==' কেবলমাত্র অক্ষরের সংখ্যাকে 4 এর একাধিক করে তৈরি করতে হবে আপনি এটিকে মুছে ফেলতে পারবেন, কারণ আপনি সর্বদা এটি পরে রেখে দিতে পারেন। নোট করুন যে বেস 64 বলা হয় কারণ এটি 64 টি স্বতন্ত্র অক্ষর ব্যবহার করে । বড় হাতের অক্ষর, ছোট হাতের অক্ষর এবং অঙ্কগুলি 62২। তাই বেস 64 এছাড়াও '/' এবং '+' ব্যবহার করে, যা আপনার বিলে ফিট করতে পারে বা নাও পারে।

একটি সাধারণ ভিত্তিতে, আপনি যদি বাইটগুলির স্বেচ্ছাসেবী ক্রমগুলি বর্ণানুক্রমিক অক্ষরগুলিতে এনকোড করতে চান তবে অবশ্যই কিছুটা দৈর্ঘ্য বাড়ানো হবে কারণ একটি বাইটের জন্য 256 সম্ভাব্য মান রয়েছে এবং কেবলমাত্র 62 বর্ণানুক্রমিক অক্ষর রয়েছে। একে কখনও কখনও কবুতর নীতি বলা হয় । একটি এনকোডিং স্কিমের অবশ্যই একটি ফ্যাক্টর লগ 256 / লগ 62 = 1.344 (বাইটগুলির সমস্ত ক্রমগুলির গড়) এর দৈর্ঘ্যের গড় দৈর্ঘ্য থাকতে হবে ; অন্যথায়, এর অর্থ হ'ল কিছু কবুতর কোথাও কোথাও মারা গিয়েছে এবং আপনি ক্ষতি ছাড়াই তাদের ফিরে পাবেন না (যার অর্থ: দুটি পৃথক স্ট্রিং একই সাথে এনকোডযুক্ত, সুতরাং ডিকোডিং নির্ভরযোগ্যভাবে কাজ করতে পারে না)।

এখন, এটি বেশ সম্ভব যে আপনার স্ট্রিংগুলি ঠিক "অভিন্ন র্যান্ডম বাইটের ক্রম" নয়; আপনার স্ট্রিংগুলির কিছু অর্থ রয়েছে যার অর্থ বাইটগুলির সর্বাধিক সম্ভাব্য ক্রম ঘটবে না, কারণ এগুলি অর্থহীন। সেই ভিত্তিতে, আপনি সম্ভবত একটি এনকোডিং স্কিম তৈরি করতে পারেন যা জেনেরিক বেস 64 এর চেয়ে কম দৈর্ঘ্যের বর্ধন করতে পারে (বা বেস 62 আপনার যদি কঠোর বর্ণানুক্রমিক অক্ষরগুলিকে আঁকড়ে রাখার প্রয়োজন হয়)। এটি লসলেস ডেটা সংক্ষেপণ । এটি ইনপুট হিসাবে প্রদর্শিত হতে পারে তার একটি স্পষ্টভাবে সংজ্ঞায়িত সম্ভাব্য মডেলের উপর কাজ করে।

সংক্ষিপ্তসার: অক্ষরক্রমিক ক্রমগুলিতে স্ট্রিংগুলি এনকোড করার জন্য একটি জেনেরিক স্কিম যেমন কোনও বা সামান্য দৈর্ঘ্যের এক্সটেনশন কখনই ঘটে না, বিদ্যমান থাকতে পারে না; এটি গাণিতিক অসম্ভবতা। আপনি যে ধরণের ইনপুট স্ট্রিংয়ের প্রত্যাশা করেছেন তার জন্য উপযুক্ত একটি নির্দিষ্ট স্কিম সম্ভবত উপস্থিত থাকতে পারে (তবে যে ধরণের স্ট্রিংয়ের মুখোমুখি হতে পারেন তা আপনি জানাতে পারেন না, নুনি আপনাকে এতে সহায়তা করতে পারে)।


1
+1, দুর্দান্ত ব্যাখ্যা। 4 এর একাধিক হওয়া দৈর্ঘ্যের সাথে =/ ==সম্পর্কিত হওয়ার বিষয়ে আমি জানতাম না আমি আমার প্রয়োজনের জন্য এটি ঘিরে কাজ করতে সক্ষম হতে পারি
অ্যাবে মিজস্লার

মনে মনে, এটি কবুতরের ঘাটতির অভাব ধরে নেয়। ইউনিকোডে প্রচুর চিঠি রয়েছে। আসল সমস্যাটি সম্পর্কে আমাদের আরও ভাল বোঝার প্রয়োজন ।
এমসাল্টার্স

@ টম আপনি লগ বিভাগ ব্যবহার করে গড় দৈর্ঘ্যের এক্সটেনশন ফ্যাক্টরটি কীভাবে গণনা করেছেন? মধ্যে ডায়াগ্রাম উপর ভিত্তি করে en.wikipedia.org/wiki/Base64 এটি সম্পূর্ণই স্বজ্ঞাত জ্ঞান প্রতিটি unencoded গৃহস্থালির কাজ জন্য এটি করুন Base64- মধ্যে 4/3 অক্ষর লাগে প্রতিনিধিত্ব করে তোলে। আপনি কীভাবে গণিতের সাথে একই উপসংহারে এসেছিলেন তা ভাবছি ... ধন্যবাদ :)
জনাথন লিন

আমার খারাপ, বোকা প্রশ্ন। লগ (256) = 8 বিট, লগ (64) = 6 বিট, অতএব বেস 64 এর জন্য অনুপাত 8/6 = 4/3 = 1.333। চিয়ার্স।
জোনাথন লিন

4

পুনরায় এনকোডিং অক্ষরগুলি সাধারণত করা হয় যখন গ্রহণকারী সিস্টেমগুলি তাদের প্রক্রিয়া করতে না পারে। উদাহরণস্বরূপ, BASE64 দীর্ঘ ডাটা সিকোয়েন্সগুলি উপস্থাপন করতে অক্ষরের 6 বিট (2 6 , তাই 64৪) ব্যবহার করে ডেটা উপস্থাপন করছে (কখনও কখনও প্রদর্শিত হবে "==" প্রান্তিককরণের জন্য প্যাডিং হয়)। এটি কারণ ইমেইলে আপনার ছবি ফাইলটিতে 0xFE থাকতে পারে এবং আপনার মেল সার্ভারটি (বা অন্য কোনও traditionতিহ্যগতভাবে অপ্রকাশিত অক্ষর) প্রেরণে অসন্তুষ্ট হবে।

"আকার হ্রাস করে" এমন কোনও এনকোডিং নেই। এনকোডিংগুলি তারা প্রতিনিধিত্ব করে এমন চরিত্রের বিটগুলির ম্যাপিং। এটি বলেছিল, এএসসিআইআই হ'ল একটি বিট অক্ষর সেট (এনকোডিং) যা প্রায়শই 8 বিটের জায়গাতে সঞ্চয় করা হয়। আপনি যদি স্বীকার করেন এমন ব্যাপ্তিগুলি সীমাবদ্ধ করে রাখেন, আপনি নিয়ন্ত্রণের অক্ষরগুলিও ছড়িয়ে দিতে পারেন।

এই পদ্ধতিটি ব্যবহারের অর্থ আপনাকে বিট স্তরে জিনিসগুলি লিখতে হবে, এবং এটি মেশিনের গতি এবং নির্দেশাবলীর সাথে কিছুটা নরকও খেলে কারণ সমস্ত আধুনিক মেশিনে সারিবদ্ধতা রয়েছে যা 8 বিটের গুণক। উদাহরণস্বরূপ, ইউনিকোডটি ইউটিএফ -8, ইউটিএফ -16, এবং ইউটিএফ -32।

আপনি যদি এটি সুরক্ষার জন্য করছেন (সে কারণেই আপনি এটি সিকিউরিটি.এসইতে পোস্ট করেছেন, ঠিক?), কেবল জিনিসগুলি ফিল্টার করুন এবং এগুলিকে সাধারণত সংরক্ষণ করুন। আপনি যদি স্থান বাঁচাতে এই কাজটি করে থাকেন তবে সমস্ত অতিরিক্ত কোড এবং ধীর অ্যাক্সেসের সময় বিবেচনা করুন (কারণ বেশিরভাগ এন্ট্রি অ্যাড্রেসের সীমানা অতিক্রম করবে) স্থান সাশ্রয়ের জন্য মূল্যবান কিনা consider

বাই বাই, নীচে একটি সিএস কোর্সের একটি স্নিপেট রয়েছে যেখানে আমাদের 8 বিট স্টোরেজ থেকে bit বিটে ASCII রূপান্তর করতে হয়েছিল:

    memset(dest,0x00,8);
    memcpy(dest, source, length);

    for (int i = 0; i < 8; i++) {
            if (dest[i] & 0x80) {
                    fprintf(stderr, "%s: %s\n", dest, "Illegal byte sequence");
                    exit(EILSEQ);
            }
    }

    dest[0] = 0x7F & dest[0] | 0x80 & dest[1] << 7;
    dest[1] = 0x3F & dest[1] >> 1 | 0xC0 & dest[2] << 6;
    dest[2] = 0x1F & dest[2] >> 2 | 0xE0 & dest[3] << 5;
    dest[3] = 0x0F & dest[3] >> 3 | 0xF0 & dest[4] << 4;
    dest[4] = 0x07 & dest[4] >> 4 | 0xF8 & dest[5] << 3;
    dest[5] = 0x03 & dest[5] >> 5 | 0xFC & dest[6] << 2;
    dest[6] = 0x01 & dest[6] >> 6 | 0xFE & dest[7] << 1;
    dest[7] = 0x00; //Clearing out

2

আপনি উদাহরণস্বরূপ gzip, bzip2 বা lzma এর সাহায্যে ডেটাটি সঙ্কুচিত করতে পারেন এবং তারপরে ব্যবহৃত অক্ষর সেটটি সীমাবদ্ধ করতে বেস 64 দ্বারা চালাতে পারেন। এটি কেবল কয়েকশত বাইট বা তারও বেশি বড় স্ট্রিংগুলিতে উপকারী।


1

এলজেড কম্প্রেশন কেন ব্যবহার করবেন না? এটি স্ট্রিং সংকোচনের একটি শালীন উপায় হতে পারে তবে দীর্ঘ স্ট্রিংয়ের ক্ষেত্রে এটি আরও দক্ষ হবে। আপনি টার্গেটের স্ট্রিংটি কতক্ষণ এনকোড করতে চান?


এলটিজেড কম্প্রেশনটি জিটিপ বা বিজিপ 2 এর সাথে অতীতের পরামর্শে কীভাবে তুলনা করে?
NoChance

জিজিপ এলজেড এবং হাফম্যান কোডিংয়ে নির্মিত। LZ উপর আরো en.wikipedia.org/wiki/LZ77
A.Rashad
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.