বেস৬৪

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

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

কাঠামো[সম্পাদনা]

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

a - zমোট ২৬ টি

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

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

Value Char   Value Char   Value Char   Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

উদাহরণ[সম্পাদনা]

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

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 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
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();
    }

কারিগরি ইতিহাস[সম্পাদনা]

বানানভেদে সারাংশ[সম্পাদনা]

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

Variant Char for index 62 Char for index 63 pad char Fixed encoded line-length Maximum encoded line length Line separators Characters outside alphabet Line checksum
Original Base64 for Privacy-Enhanced Mail (PEM) (RFC 1421, deprecated) + / =(mandatory) Yes (except last line) 64 CR+LF Forbidden (none)
Base64 transfer encoding for MIME (RFC 2045) + / =(mandatory) No (variable) 76 CR+LF Accepted (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) 76 CR+LF Forbidden 24-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) Forbidden Separate 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। সংগৃহীত ২০১২-০৬-২১