Blog. Just Blog

Функции base64 на JavaScript

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
По умолчанию в JavaScript отсутствуют штатные функции преобразования данных по алгоритму Base64. Ниже приведены две функции для base64-кодирования и декодирования на JavaScript. Их удобно использовать при передаче различных данных через AJAX или через web-формы, а также для хранения в исходном коде бинарных данных, например, зашифрованных строк.
  1. // Функция кодирования строки в base64
  2. function base64encode(str) {
  3.     // Символы для base64-преобразования
  4.     var b64chars 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg'+
  5.                    'hijklmnopqrstuvwxyz0123456789+/=';
  6.     var b64encoded '';
  7.     var chr1chr2chr3;
  8.     var enc1enc2enc3enc4;
  9.  
  10.     for (var i=0i<str.length;) {
  11.         chr1 str.charCodeAt(i++);
  12.         chr2 str.charCodeAt(i++);
  13.         chr3 str.charCodeAt(i++);
  14.  
  15.         enc1 chr1 >> 2;
  16.         enc2 = ((chr1 3) << 4) | (chr2 >> 4);
  17.  
  18.         enc3 isNaN(chr2) ? 64:(((chr2 15) << 2) | (chr3 >> 6));
  19.         enc4 isNaN(chr3) ? 64:(chr3 63);
  20.  
  21.         b64encoded += b64chars.charAt(enc1) + b64chars.charAt(enc2) +
  22.                       b64chars.charAt(enc3) + b64chars.charAt(enc4);
  23.     }
  24.     return b64encoded;
  25. }
Функция декодирования, соответственно, выполняет обратное действие. Дополнительно в ней перед декодированием выполняется очистка исходной строки от символов, которые не относятся к base64-символам. Поэтому функции base64decode можно передавать не цельную строку, а, например, разделенную переносами строк или пробелами для удобства восприятия.
  1. // Функция декодирования строки из base64
  2. function base64decode(str) {
  3.     // Символы для base64-преобразования
  4.     var b64chars 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg'+
  5.                    'hijklmnopqrstuvwxyz0123456789+/=';
  6.     var b64decoded '';
  7.     var chr1chr2chr3;
  8.     var enc1enc2enc3enc4;
  9.  
  10.     str str.replace(/[^a-z0-9\+\/\=]/gi'');
  11.  
  12.     for (var i=0i<str.length;) {
  13.         enc1 b64chars.indexOf(str.charAt(i++));
  14.         enc2 b64chars.indexOf(str.charAt(i++));
  15.         enc3 b64chars.indexOf(str.charAt(i++));
  16.         enc4 b64chars.indexOf(str.charAt(i++));
  17.  
  18.         chr1 = (enc1 << 2) | (enc2 >> 4);
  19.         chr2 = ((enc2 15) << 4) | (enc3 >> 2);
  20.         chr3 = ((enc3 3) << 6) | enc4;
  21.  
  22.         b64decoded b64decoded String.fromCharCode(chr1);
  23.  
  24.         if (enc3 64) {
  25.             b64decoded += String.fromCharCode(chr2);
  26.         }
  27.         if (enc4 64) {
  28.             b64decoded += String.fromCharCode(chr3);
  29.         }
  30.     }
  31.     return b64decoded;
  32. }
Ну и напоследок, примеры вызова этих функций:
  1. // Пример использования функций
  2. alert (base64encode ('ManHunter / PCL'));
  3. alert (base64decode ('SGF2ZSBhIE5pY2UgRGF5IQ=='));
Как видите, ничего сложного. Также можно пойти дальше и расширить этими функциями объект String, например, для использования в различных фреймворках.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 12598 | Комментариев: 13

Метки: JavaScript, base64
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (31.01.2017 в 13:52):
Видимо, потому что btoa не поддерживается Internet Explorer 6-9
Anonymous (31.01.2017 в 12:13):
А почему бы просто не использовать btoa("string"); ?
ManHunter (27.12.2012 в 15:01):
в юникоде
Михаил (27.12.2012 в 15:00):
Я нашел очень странную и непонятную ошибку, если кодировать строку начинающуюся с букв "вк", например "вконтакте", после вк образуются непонятные каракули. Не могли бы вы подсказать в чем тут дело?
Руслан (29.06.2012 в 20:38):
ну можно отсекать запятую с пробелом, в крайнем случае ссылку запостят в виде строки ",%20..."
ManHunter (29.06.2012 в 18:42):
Он-то как раз знает. Не знают те, кто на своих сайтах по какой-то причине используют запятую в параметрах, и ради которых ее пришлось включать в парсер. Я бы тоже с огромным удовольствием активировал все до запятой.
Руслан (29.06.2012 в 18:39):
В текущей версии оперы например btoa и atob работают или только с ASCII или просто некорректно с UTF-8 строками, короче выдает ошибку. Я пользуюсь этим http://www.webtoolkit.info/jav...-base64.html с небольшими правками отсюда http://stackoverflow.com/a/6836708, хотя как я понял это то же решение на что дал ссылки Cyko.

С русскими не работает потому что нужно перед работой перевести utf-8 коды символов кириллицы в два-три байта или наоборот. По ссылкам выше это делают utf8_encode и utf8_decode.

ManHunter, парсер для ссылок в комментах не знает о знаках пунктуации )
Он (11.05.2012 в 14:43):
Почему не работает с русскими буквами?
Infocatcher (24.06.2011 в 20:46):
В Firefox, Opera, Chrome и Safari есть btoa() и atob():
https://developer.mozilla.org/.../window.btoa
https://developer.mozilla.org/.../window.atob

А IE как обычно особенный. :)
ManHunter (23.06.2011 в 23:49):
Of course, another great site! Thx :)
ManHunter (23.06.2011 в 10:56):
Главное, что очень хорошо для понимания алгоритма.
Isaev (23.06.2011 в 02:10):
Компактно!

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0039 сек.) / Память: 4.5 Mb
Наверх