function base64_encode( data ) { // Encodes data with MIME base64
//
// + original by: Tyler Akins (http://rumkin.com)
// + improved by: Bayron Guevara
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, bits, i=0, enc='';
do { // pack three octets into four hexets
o1 = data.charCodeAt(i++);
o2 = data.charCodeAt(i++);
o3 = data.charCodeAt(i++);
bits = o1<<16 | o2<<8 | o3;
h1 = bits>>18 & 0x3f;
h2 = bits>>12 & 0x3f;
h3 = bits>>6 & 0x3f;
h4 = bits & 0x3f;
// use hexets to index into b64, and append result to encoded string
enc += b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
} while (i < data.length);
switch( data.length % 3 ){
case 1:
enc = enc.slice(0, -2) + '==';
break;
case 2:
enc = enc.slice(0, -1) + '=';
break;
}
return enc;
}
Спасибо! Использую encode decode для простенькой шифровки/расшифровки.
Функция работает неправильно.
Hint: Смотрим спецификацию charCodeAt
Подтверждаю! Функция со спецсимволами и пр. юникодной изюминой работает неправильно! Вы бы хоть тестировали перед выкладкой, что ли...
Вот полностью рабочий вариант:
вот вариант для чтения бинариков на странице с вин1251 кодировкой
function base64en(str) { var b,c,out='', l=false,i=0, key6='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', key8='ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—!™љ›њќћџ'+String.fromCharCode(160)+'ЎўЈ¤Ґ¦§Ё©Є«¬'+String.fromCharCode(173)+'®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя', len = str.length; while (i<len) { out+=key6.charAt((b=(((c=str.charCodeAt(i++))>127)?((c==65533)?(152<<16):((((c=key8.indexOf(String.fromCharCode(c))|128)<0)?0:c<<16))):c<<16)|(((c=str.charCodeAt(i++))>127)?((c==65533)?152<<8:((((c=key8.indexOf(String.fromCharCode(c))|128)<0)?0:c<<8))):c<<8)|(((c=str.charCodeAt(i++))>127)?((c==65533)?152:((((c=key8.indexOf(String.fromCharCode(c))|128)<0)?0:c))):c))>>18)+key6.charAt(b>>12&63)+key6.charAt(b>>6&63)+key6.charAt(b&63); } return out; }функция в принципе правильная, только в конце текста надо добавлять
'=' при не полном наборе символов. В жизни разницы не заметил, хотя может глюки при декодировании в PHP из за этого. Подправленный код -
function base64en(str) { var i,l,b,b2,b3,c,out='',key6='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', key8='ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—!™љ›њќћџ'+String.fromCharCode(160)+'ЎўЈ¤Ґ¦§Ё©Є«¬'+String.fromCharCode(173)+'®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя' for(i=0,l=str.length;i<l;){ out+=key6.charAt((b=(((c=str.charCodeAt(i++))>127)?((c==65533)?(152<<16):((((c=key8.indexOf(String.fromCharCode(c))|128)<0)?0:c<<16))):c<<16)|(((c=str.charCodeAt(i++))>127)?((c==65533)?152<<8:((((c=key8.indexOf(String.fromCharCode(c))|128)<0)?0:(b2=isNaN(c),c<<8)))):c<<8)|(((c=str.charCodeAt(i++))>127)?((c==65533)?152:((((c=key8.indexOf(String.fromCharCode(c))|128)<0)?0:c))):(b3=isNaN(c),c)))>>18)+key6.charAt(b>>12&63)+(b2 ? '=' : key6.charAt(b>>6&63))+(b3 ? '=' : key6.charAt(b&63)); } return out; }скорость обработки 3-4 метров в секунду. так что норм.
Конечно, на PHP это сделать проще, но удобно использовать в HTML Aplication
глупо всё это.
в современных браузерах давно уже есть atob() и btoa ()
Не надо ля-ля. Моя функция работает и работает нормально! А atob и btoa работают только с английскими символами.
2 elagin91 - не работает. Сбивается на слове Волобуев записанном в utf-8. Самому смешно, но факт.
Не знаю, где и как ты тестировал, но у меня всё норм.
Спасибо за функцию. Идеально подходит для моего менеджера паролей. Правда я немного кода всё же добавил для кодирования двоичных данных (т.е. любых массивов)
if (typeof(data) == "string"){ o1 = data.charCodeAt(i++); o2 = data.charCodeAt(i++); o3 = data.charCodeAt(i++); } else{ o1 = data[i++]; o2 = data[i++]; o3 = data[i++]; }