Javascript.RU

PHP-функция: base64_decode

Javascript:

function base64_decode( data ) {	// Decodes data encoded with MIME base64
	// 
	// +   original by: Tyler Akins (http://rumkin.com)


	var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	var o1, o2, o3, h1, h2, h3, h4, bits, i=0, enc='';

	do {  // unpack four hexets into three octets using index points in b64
		h1 = b64.indexOf(data.charAt(i++));
		h2 = b64.indexOf(data.charAt(i++));
		h3 = b64.indexOf(data.charAt(i++));
		h4 = b64.indexOf(data.charAt(i++));

		bits = h1<<18 | h2<<12 | h3<<6 | h4;

		o1 = bits>>16 & 0xff;
		o2 = bits>>8 & 0xff;
		o3 = bits & 0xff;

		if (h3 == 64)	  enc += String.fromCharCode(o1);
		else if (h4 == 64) enc += String.fromCharCode(o1, o2);
		else			   enc += String.fromCharCode(o1, o2, o3);
	} while (i < data.length);

	return enc;
}

Примеры:

base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
'Kevin van Zonneveld'


Автор: pronax (не зарегистрирован), дата: 30 августа, 2008 - 10:57
#permalink

если PHP закадирован через base64, как его раскадировать? незнаете?


Автор: Гость (не зарегистрирован), дата: 23 декабря, 2008 - 18:47
#permalink

Судя по
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
это будет работать только для инглиша, руски будет отбражаться не коректно


Автор: Гость (не зарегистрирован), дата: 24 декабря, 2008 - 01:10
#permalink

Вы не правы, здесь перечислены символы, допустимые в base64-кодировании, а при помощи base64 можно акодировать любые двоичные данные, в том числе и тексты на различных языках и в различных кодировках.


Автор: PaCo, дата: 26 декабря, 2008 - 01:25
#permalink

'7vfl7fwg8PPx8ero6SDy5erx8g==' = очень русский текст - кодировка cp1251,

document.write(base64_decode('7vfl7fwg8PPx8ero6SDy5erx8g==')) в результате мусор :

î÷åíü ðóññêèé òåêñò


Автор: kirilloid (не зарегистрирован), дата: 5 июня, 2009 - 19:46
#permalink

Ну так это вы же cp1251 использовали.
А получаете на выходе совсем не факт, что такую кодировку.

«î÷åíü ðóññêèé òåêñò» → «очень русский текст» (CP1252 → CP1251)
http://www.artlebedev.ru/tools/decoder/


Автор: Михаил (не зарегистрирован), дата: 16 апреля, 2009 - 20:08
#permalink

Да уж, с русским тут действительно траблы!
Но, если реч идёт о Javascript то эту проблему легко решить следующим мокаром:

base64_encode(), добавим в начало выполнения функции data = escape(data);
Изначально зашифруем русский текст.

function base64_encode( data ) {    

    data = escape(data);  
 
    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;
} 

Примеры:

Теперь base64_decode()
Позволим функции разкодировать base64, мы получим наш зашифрованый escape()
Перед тем как вернуть return enc; разшифруем

return unescape(enc);

function base64_decode( data ) {   

    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i=0, enc='';
 
    do {  
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));
 
        bits = h1<<18 | h2<<12 | h3<<6 | h4;
 
        o1 = bits>>16 & 0xff;
        o2 = bits>>8 & 0xff;
        o3 = bits & 0xff;
 
        if (h3 == 64)      enc += String.fromCharCode(o1);
        else if (h4 == 64) enc += String.fromCharCode(o1, o2);
        else               enc += String.fromCharCode(o1, o2, o3);
    } while (i < data.length);
 
    return unescape(enc);
}

Автор: Ksat (не зарегистрирован), дата: 12 января, 2010 - 16:31
#permalink

Функции действительно некорректно работают для кирилических языков. Это легко проверить вызвал по очереди енкод и декод для строки русского языка в кодировке KOI8 или CP-1251


Автор: Гость (не зарегистрирован), дата: 6 декабря, 2011 - 17:49
#permalink

btoa()/atob()
в любом браузере кроме IE


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
3 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Реклама
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние обсуждения на форуме
Forum
Последние комментарии