**بیس۶۴** (به انگلیسی: Base64) عنوان یک کدبندی دودویی به متن است. در این کدبندی، آرایه‌ای از بایت‌ها به صورت نویسه‌های اَسکی کدگذاری می‌شوند. کاربرد آن در تبادل اطلاعات از طریق محیط‌هایی که تنها از کدهای اسکی ۷-بیتی پشتیبانی می‌کنند (مانند ایمیل) است. توصیف کامل این کدبندی در RFC 1252 آمده است.

کدبندی
------

بیس۶۴ را می‌توان یک دستگاه اعداد، مشابه دستگاه اعداد هشت‌هشتی و دستگاه اعداد شانزده‌شانزدهی، اما در مبنای ۶۴ دانست. در حالی که یک سامانهٔ هشت‌هشتی از ۳ بیت، و یک سامانهٔ شانزده‌شانزدهی از ۴ بیت برای ذخیره‌سازی هر رقم استفاده می‌کنند، در مبنای ۶۴ هر رقم در ۶ بیت ذخیره می‌شود. در عمل بیس۶۴ داده‌های دودویی ۸ بیتی را به قالب ۷ بیتی تبدیل می‌کند؛ به طور معمول ۳ بایتِ ۸ بیتی، تبدیل به ۴ بایت ۷ بیتی می‌شوند که ۳۳٪ از داده‌های اولیه حجیم‌تر است. برای نمایش اطلاعات، تنها از نویسه‌های A-Z، a-z، 0-9، / و = (برای پدگذاری) استفاده می‌شود. (هر یک از نتایج ۶ یا ۷ بیتی حاصل بر یکی از نویسه‌های اسکی منطبق خواهد شد)

اگر در پایان متن، کمتر ۲۴ بیت (۳ بایت) برای کدبندی باقی‌مانده باشد، برای ممکن‌شدن کدبندی، به سمت راست بایت‌ها، بیت‌های 0 می‌افزایند، این موضوع با استفاده از نویسهٔ «=» مشخص می‌شود. به عبارت دیگر اگر آخرین گروه داده، تنها دارای ۲ بایت باشد، ۱۲ بیت نخست آن به طور معمول (از روی جدول) کدگذاری می‌شوند و ۴ بیت باقی‌مانده با استفاده از دو بیت 0 کامل می‌گردند تا تبدیل به دادهٔ ۶ بیتی شود، سپس نتیجه را به مبنای ۶۴ می‌برند. برای مشخص‌شدن این موضوع یک علامت «=» به پایان رشتهٔ حاصل افزوده خواهد شد. به طور مشابه اگر در پایان متن تنها ۱ بایت (۸ بیت) باقی‌مانده باشد، ۶ بیت نخست به طور معمول کدبندی می‌شوند، دو بیت پایانی با استفاده از چهار 0 تکمیل می‌گردند، و رشتهٔ حاصل با استفاده از دو علامت «=» نشانه‌گذاری خواهد شد.

جدول بیس۶۴ استخراج شده از RFC 4648
----------------------------------

جدول زیر قسمتی از RFC 4648 §4 است.

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| شاخصه | کد دودویی | کاراکتر |  | شاخصه | کد دودویی | کاراکتر |  | شاخصه | کد دودویی | کاراکتر |  | شاخصه | کد دودویی | کاراکتر |
| 0 | 000000 | `A` | 16 | 010000 | `Q` | 32 | 100000 | `g` | 48 | 110000 | `w` |
| 1 | 000001 | `B` | 17 | 010001 | `R` | 33 | 100001 | `h` | 49 | 110001 | `x` |
| 2 | 000010 | `C` | 18 | 010010 | `S` | 34 | 100010 | `i` | 50 | 110010 | `y` |
| 3 | 000011 | `D` | 19 | 010011 | `T` | 35 | 100011 | `j` | 51 | 110011 | `z` |
| 4 | 000100 | `E` | 20 | 010100 | `U` | 36 | 100100 | `k` | 52 | 110100 | `0` |
| 5 | 000101 | `F` | 21 | 010101 | `V` | 37 | 100101 | `l` | 53 | 110101 | `1` |
| 6 | 000110 | `G` | 22 | 010110 | `W` | 38 | 100110 | `m` | 54 | 110110 | `2` |
| 7 | 000111 | `H` | 23 | 010111 | `X` | 39 | 100111 | `n` | 55 | 110111 | `3` |
| 8 | 001000 | `I` | 24 | 011000 | `Y` | 40 | 101000 | `o` | 56 | 111000 | `4` |
| 9 | 001001 | `J` | 25 | 011001 | `Z` | 41 | 101001 | `p` | 57 | 111001 | `5` |
| 10 | 001010 | `K` | 26 | 011010 | `a` | 42 | 101010 | `q` | 58 | 111010 | `6` |
| 11 | 001011 | `L` | 27 | 011011 | `b` | 43 | 101011 | `r` | 59 | 111011 | `7` |
| 12 | 001100 | `M` | 28 | 011100 | `c` | 44 | 101100 | `s` | 60 | 111100 | `8` |
| 13 | 001101 | `N` | 29 | 011101 | `d` | 45 | 101101 | `t` | 61 | 111101 | `9` |
| 14 | 001110 | `O` | 30 | 011110 | `e` | 46 | 101110 | `u` | 62 | 111110 | `+` |
| 15 | 001111 | `P` | 31 | 011111 | `f` | 47 | 101111 | `v` | 63 | 111111 | `/` |
| فاصله گذاری | = |  |

### مثال

جمله زیر که در رایانش ابری بسیار معروف است:

> 
> Many hands make light work.
> 
> 
> 

پس از کدبندی بیس۶۴ به صورت زیر تغییر خواهد کرد:

> 
> TWFueSBoYW5kcyBtYWtlIGxpZ2h0IHdvcmsu
> 
> 
> 

در صورتی بخواهیم وارد جزییات تبدیل قسمت اول جمله انگلیسی بالا در بیس۶۴ بشویم باید به جدول زیر مراجعه کنیم. در نقل قول مذکور، کلمه *Man* به *TWFu* تبدیل می شود. در کدبندی اسکی حروف M و a و n به ترتیب دارای شماره شاخصه `77،` `97،` و `110` هستند. این شماره ها در نمایش 8 تایی به صورت بیت های `01001101`, `01100001`, و `01101110` قابل بیان هستند. این سه عدد به هم چسبانده شده و به عدد بزگتر `010011010110000101101110` تبدیل می شود. حال باید شش بیت به شش بیت این عدد را جداسازی کرد.

در تبدیل بیس۶۴ این سه حرف اسکی به چهار نشانه تبدیل می شود که در جدول زیر فابل مشاهده است

|  |  |  |  |  |
| --- | --- | --- | --- | --- |
| منبع | متن (اسکی) | M | a | n |
| هشت‌تایی | 77 (0x4d) | 97 (0x61) | 110 (0x6e) |
| بیت ها | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
| کدبندیبیس۶۴ | شش بندی | 19 | 22 | 5 | 46 |
| کاراکتر | T | W | F | u |
| هشت‌تایی | 84 (0x54) | 87 (0x57) | 70 (0x46) | 117 (0x75) |

اگرتنها دو هشت‌تایی در اختیار داشته باشیم (یعنی 'Ma')، یا اگر آخرین گروه فایل تبدیل شدن، تنها دارای دو دو کاراکتر باشد، تمامی 16 بیت آنها توسط سه نشانه بیس۶۴ آماده تبدیل می شود. دو بیت با کمترین ارزش باقی مانده به طور پیشفرض باید تبدیل به صفر شوند و شش بیتی باقی مانده نیز به = تبدیل می شود.

|  |  |  |  |  |
| --- | --- | --- | --- | --- |
| منبع | متن (اسکی) | M | a |  |
| هشت‌تایی | 77 (0x4d) | 97 (0x61) |
| بیت ها | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |  |  |  |  |  |  |
| کدبندیبیس۶۴ | شش بندی | 19 | 22 | 4 | Padding |
| Character | T | W | E | = |
| هشت‌تایی | 84 (0x54) | 87 (0x57) | 69 (0x45) | 61 (0x3D) |

در صورتی که فقط بک کاراکتر 8 بیتی داشته باشیم، یا وقتی که آخرین گروه بندی کاراکترها فقط دارای یک کاراکتر 8 بیتی باشد، این 8 بیت توسط دو دو نشانه بیس۶۴ (برابر با 12 بیت) آماده تبدیل می شوند. چهار بیت با کمترین ارزش باقی مانده به طور پیشفرض باید تبدیل به صفر شوند. در ادامه نیز دو کاراکتر = خواهند آمد. 

|  |  |  |  |
| --- | --- | --- | --- |
| منبع | Text (ASCII) | M |  |
| Octets | 77 (0x4d) |
| Bits | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |  |  |  |  |  |  |  |  |  |  |  |  |
| کدبندیبیس۶۴ | شش بندی | 19 | 16 | Padding | Padding |
| کاراکتر | T | Q | = | = |
| هشت‌تایی | 84 (0x54) | 81 (0x51) | 61 (0x3D) | 61 (0x3D) |

کدگشایی
-------

در زمان کدگشایی عکس کارهایی که در زمان کدگذاری انجام شده صورت می‌گیرد. اگر کدگشا به نویسه‌ای بر بخورد که در جدول نویسه‌های بیس۶۴ نباشد، از آن چشم‌پوشی می‌کند. این نویسه‌ها ممکن است نویسه‌های ناموجود در جدول مانند سرخط یا نشانگر خطا در زمان انتقال باشند.

جستارهای وابسته
---------------

* کدبندی نویسه
* یوتی‌اف-۷
* کدبندی درصدی

منابع
-----

1. ↑  Knudsen, *Java Cryptography*, 8.
2. ↑  Knudsen, *Java Cryptography*, 8.
3. ↑  Cooper, *Beginning Ruby: From Novice to Professional*, 498.
4. ↑  Wilding-McBride, *Java Development on PDAs: Building Applications for PocketPC and Palm Devices*, 153.
5. ↑  Dostálek and  Kabelová, *Understanding TCP/IP: A Clear and Comprehensive Guide to TCP/IP Protocols*, 374.
6. ↑  Wilding-McBride, *Java Development on PDAs: Building Applications for PocketPC and Palm Devices*, 153.
7. ↑  Dostálek and  Kabelová, *Understanding TCP/IP: A Clear and Comprehensive Guide to TCP/IP Protocols*, 373.

* Knudsen, J. (1998). *Java Cryptography* (به فنلاندی). O'Reilly Media. Retrieved 2013-12-01.
* Cooper, P. (2009). *Beginning Ruby: From Novice to Professional*. Books for professionals by professionals (به انگلیسی). Apress. Retrieved 2013-12-01.
* Wilding-McBride, D. (2003). *Java Development on PDAs: Building Applications for PocketPC and Palm Devices*. Java (Addison-Wesley) (به انگلیسی). Addison-Wesley. Retrieved 2013-12-01.
* Dostálek, L.; Kabelová, A. (2006). *Understanding TCP/IP: A Clear and Comprehensive Guide to TCP/IP Protocols*. From technologies to solutions (به انگلیسی). Packt Publishing, Limited. Retrieved 2013-12-01.
* Dostálek, L.; Kabelová, A. (2006). *Understanding TCP/IP: A Clear and Comprehensive Guide to TCP/IP Protocols*. From technologies to solutions (به انگلیسی). Packt Publishing, Limited. Retrieved 2013-12-01.