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);
}

Автор: Mr ChrUm (не зарегистрирован), дата: 25 апреля, 2018 - 22:56
#permalink

Спасибо большое за скрипт


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

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


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

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


Автор: Гость (не зарегистрирован), дата: 22 марта, 2012 - 19:57
#permalink

Нашел решение!
При декодировании выводится кривая кодировка, чтобы вывести в utf8 используйте функцию:


function utf8 (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;

while ( i < utftext.length ) {

c = utftext.charCodeAt(i);

if (c < 128) {
string += String.fromCharCode(c);
i++;
}
else if((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i+1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
}
else {
c2 = utftext.charCodeAt(i+1);
c3 = utftext.charCodeAt(i+2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}

}

return string;
}

а в самой base64_decode, замените return enc; на return utf8(enc);


Автор: elagin91, дата: 14 мая, 2014 - 12:08
#permalink

Посоны, я написал норм функцию, которая сможет раскодировать любой base64 текст, в кодировке UTF-8 (если это не UTF-8 текст, то функция выкинет false)

function base64_decode(c){0<=c.indexOf("=")&&(c=c.substr(0,c.indexOf("=")));for(var k=0,d=0,b,l,e,g,f=0,a,h,m="";k<c.length;++k){l="="==c.charAt(k)?0:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(c.charAt(k));d=(d+6)%8;if(6!=d){b+=l>>d;if(0==f)g=!0,h=0,e=1,128>b&&(e=0,h=b&64,g=!1);else if(128!=(b&192))return!1;for(a=32;g&&0<a;a>>=1)b&a?++e:g=!1;g||(a=6+6*f-e,6<a&&(a=6),a&&(h+=b%(1<<a)<<6*(e-f)));f==e?(m+=String.fromCharCode(h),f=0):++f}b=d?l%(1<<d)<<8-d:0}return m}

Автор: Lekaoleg, дата: 9 декабря, 2015 - 09:08
#permalink

Всё работает!


Автор: andrewinc, дата: 28 февраля, 2020 - 10:19
#permalink

В node.js допустим вариант:

const base64_encode = (data) => Buffer.from(data).toString('base64');
const base64_decode = (data) => Buffer.from(data, 'base64').toString('utf8');

Пример:
let encoded = base64_encode('Hello world'); // 'SGVsbG8gd29ybGQ='
base64_decode(encoded); // 'Hello world'


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 00:22
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 13:26
#permalink

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

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
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
Антиспам
6 + 1 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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