বিষয়বস্তুতে চলুন

বেস৬৪

উইকিপিডিয়া, মুক্ত বিশ্বকোষ থেকে
বেস৬৪

বেস৬৪ বেস৬৪ হল এক দল এনকোড সংখ্যা যা অ্যাসকিরবাইনারি মান থেকে রাডিক্সপদ্ধতিতে ৬৪ বেসে রূপান্তর করা হয় । এটি একটি পরিপূর্ণ এনকোডিং পদ্ধতি যা শতভাগ নির্ভুলভাবে মান ফেরত দেয় ।

কাঠামো

[সম্পাদনা]

এই পদ্ধতিতে ৬৪ টি আলাদা বর্ণ রয়েছে । যার প্রতিটি বর্ণের ডিজাইন অনুসারে ০-৬৩ মধ্যে মান নির্দিষ্ট করা আছে । [] এই পদ্ধতির বর্ণ গুলি হল :
A - Z মোট ২৬ টি

a - zমোট ২৬ টি

09 মোট ১০ টি এবং +/ মোট টি
সর্বমোট ৬৪ টি আলাদা বর্ণ ।

বেস৬৪ এর বর্ণ তালিকা:

ValueChar   ValueChar   ValueChar   ValueChar
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

উদাহরণ

[সম্পাদনা]

টমাস হব্বেস লেভিথান এর একটি উক্তি :-

Man is distinguished, not only by his reason, but by this singular passion from
other animals, which is a lust of the mind, that by a perseverance of delight
in the continued and indefatigable generation of knowledge, exceeds the short
vehemence of any carnal pleasure.

এই উক্তিটিকে বেস৬৪ পদ্ধতির মাধ্যমে এনকোডিং করার পর :-

TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=

উপরের উক্তি এবং এনকোডিং উক্তির মধ্যে অনেক পার্থক্য দেখা যাচ্ছে । এনকোডিং টেক্সট টি অ্যাস্কির ৬৪ টি বর্ণ দ্বারা গঠিত । একটি ব্যতিক্রম দেখা যাচ্ছে , এনকোডিং টেক্সট এর সর্বশেষ চারেকটার = সমান চিহ্ন ব্যবহার করা হয়েছে যা উপরের উল্লেখিত ৬৪ বর্ণের মধ্যে নেই । এনকোডিং টেক্সট এর সাথে = সমান চিহ্ন যুক্ত করার পদ্ধতিকে বলা হয় প্যাডিং যা বাইনারি সংখ্যা পদ্ধতির প্যারীটি বিট ধারণা থেকে নেয়া ।

কার্যপ্রণালী

[সম্পাদনা]
  • প্রথমে যে সংখ্যাকে বেস ৬৪ তে রূপান্তর করতে হবে তার অ্যাস্কি ডেসিমাল মান নির্ণয় করতে হবে ।
  • ডেসিমাল মানকে বাইনারি তে রূপান্তর করতে হবে ।
  • বাইনারি মানকে ৬ বিট করে নিয়ে তার ডেসিমাল মান নির্ণয় করতে হবে ।
  • নির্ণীত ডেসিমাল মানকে বেস৬৪ বর্ণ অনুযায়ী রূপান্তর করতে হবে ।

প্যাডিং এর ব্যবহার

[সম্পাদনা]

এনকোডিং এর শেষে '=' সমান চিহ্ন থাকলে বুঝতে হবে যে এনকোডিংয়ের সময় কিছু বিট ধার নেয়া হয়েছিল । করন যখন ৮ বিট বাইনারি কোডকে ৬ বিটে রূপান্তর করা হয় তখন ২ বিটের পার্থক্য থাকার কারণে বিট কম বেশি হয় । এক্ষেত্রে বিট কম হিসাবে ধরা হয় । প্যাডিং যুক্ত হবে কিনা তা বর্ণের সমষ্টির যোগফলের উপর নির্ভরশীল ।

Text content M a n
ASCII 77 (0x4d) 97 (0x61) 110 (0x6e)
Bit pattern 010011010110000101101110
Index 19 22 5 46
Base64-encoded T W F u

Man এর এনকোডিং মান TWFu নির্ণয়ের সময় কোন বিট কম হয়নি তাই TWFu এর শেষে '=' সমান চিহ্ন যোগ করার প্রয়োজন হয়নি ।

Man এর আকার ৩ সুতরাং ৮ বিট বাইনারি আকার হবে (৩ * ৮ ) = ২৪ এবং ২৪ কে ৬ দ্বারা পূর্ণ সংখ্যায় ভাগ করা সম্ভব তাই Man এর সাথে '=' যুক্ত করার প্রয়োজন হয়নি ।
r কে বেস৬৪ এ এনকোডিং করা

জাভা স্ক্রিপ্টে উদাহরণ

[সম্পাদনা]

এই কারিগরি উদাহরণটি এমন ভাবে তৈরি করা হয়েছে যাতে প্রকার সময় এবং মেমোরি দক্ষতার প্রয়োজন নেই ।

    private static final String codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    private static byte[] base64Decode(String input)    {
        if (input.length() % 4 != 0)    {
            throw new IllegalArgumentException("Invalid base64 input");
        }
        byte decoded[] = new byte[((input.length() * 3) / 4) - (input.indexOf('=') > 0 ? (input.length() - input.indexOf('=')) : 0)];
        char[] inChars = input.toCharArray();
        int j = 0;
        int b[] = new int[4];
        for (int i = 0; i < inChars.length; i += 4)     {
            // This could be made faster (but more complicated) by precomputing these index locations
            b[0] = codes.indexOf(inChars[i]);
            b[1] = codes.indexOf(inChars[i + 1]);
            b[2] = codes.indexOf(inChars[i + 2]);
            b[3] = codes.indexOf(inChars[i + 3]);
            decoded[j++] = (byte) ((b[0] << 2) | (b[1] >> 4));
            if (b[2] < 64)      {
                decoded[j++] = (byte) ((b[1] << 4) | (b[2] >> 2));
                if (b[3] < 64)  {
                    decoded[j++] = (byte) ((b[2] << 6) | b[3]);
	        }
            }
        }

        return decoded;
    }

    private static String base64Encode(byte[] in)       {
        StringBuilder out = new StringBuilder((in.length * 4) / 3);
        int b;
        for (int i = 0; i < in.length; i += 3)  {
            b = (in[i] & 0xFC) >> 2;
            out.append(codes.charAt(b));
            b = (in[i] & 0x03) << 4;
            if (i + 1 < in.length)      {
                b |= (in[i + 1] & 0xF0) >> 4;
                out.append(codes.charAt(b));
                b = (in[i + 1] & 0x0F) << 2;
                if (i + 2 < in.length)  {
                    b |= (in[i + 2] & 0xC0) >> 6;
                    out.append(codes.charAt(b));
                    b = in[i + 2] & 0x3F;
                    out.append(codes.charAt(b));
                } else  {
                    out.append(codes.charAt(b));
                    out.append('=');
                }
            } else      {
                out.append(codes.charAt(b));
                out.append("==");
            }
        }

        return out.toString();
    }

কারিগরি ইতিহাস

[সম্পাদনা]

বানানভেদে সারাংশ

[সম্পাদনা]

বিভিন্ন ধরনের বাইনারি পদ্ধতির জন্য কিছুটা ব্যতিক্রম লক্ষ্য করা যায় ।

VariantChar for index 62Char for index 63pad charFixed encoded line-lengthMaximum encoded line lengthLine separatorsCharacters outside alphabetLine checksum
Original Base64 for Privacy-Enhanced Mail (PEM) (RFC 1421, deprecated) +/=(mandatory)Yes (except last line)64CR+LFForbidden(none)
Base64 transfer encoding for MIME (RFC 2045) +/=(mandatory)No (variable)76CR+LFAccepted (discarded)(none)
Standard 'base64' encoding for RFC 3548 or RFC 4648 +/=(mandatory unless specified by referencing document)No (unless specified by referencing document)No (unless specified by referencing document)No (unless specified by referencing document)No (unless specified by referencing document)(none)
'Radix-64' encoding for OpenPGP (RFC 4880) +/=(mandatory)No (variable)76CR+LFForbidden24-bit CRC (Radix-64-encoded, including one pad character)
Modified Base64 encoding for UTF-7 (RFC 1642, obsoleted) +/(none)No (variable)(none)(none)Forbidden(none)
Standard 'base64url' with URL and Filename Safe Alphabet (RFC 4648 §5 'Table 2: The "URL and Filename safe" Base 64 Alphabet') -_=(optional if data length is known, otherwise must be percent-encoded in URL)No (variable)(application-dependent)(none)Forbidden(none)
Unpadded 'base64url' for "named information" URI's (RFC 6920) -_(none)No (variable)(application-dependent)(none)ForbiddenSeparate Luhn checksum
Non-standard URL-safe Modification of Base64 used in YUI Library (Y64)[] ._-No (variable)(application-dependent)(none)Forbidden(none)
Modified Base64 for XML name tokens (Nmtoken) .-(none)No (variable)(XML parser-dependent)(none)Forbidden(none)
Modified Base64 for XML identifiers (Name) _:(none)No (variable)(XML parser-dependent)(none)Forbidden(none)
Modified Base64 for Program identifiers (variant 1, non standard) _-(none)No (variable)(language/system-dependent)(none)Forbidden(none)
Modified Base64 for Program identifiers (variant 2, non standard) ._(none)No (variable)(language/system-dependent)(none)Forbidden(none)
Modified Base64 for Regular expressions (non standard) !-(none)No (variable)(application-dependent)(none)Forbidden(none)
Non-standard URL-safe Modification of Base64 used in Freenet ~-=No (variable)(application-dependent)(none)Forbidden(none)

তথ্যসূত্র

[সম্পাদনা]
  1. The Base16,Base32,and Base64 Data Encodings. IETF. October 2006. RFC 4648. http://tools.ietf.org/html/rfc4648। সংগৃহীত হয়েছে March 18, 2010.
  2. "YUIBlog"। YUIBlog। ২৫ মে ২০১২ তারিখে মূল থেকে আর্কাইভকৃত। সংগ্রহের তারিখ ২১ জুন ২০১২