आप जावास्क्रिप्ट में Base64 को एक स्ट्रिंग कैसे एन्कोड कर सकते हैं?


809

मेरे पास एक PHP स्क्रिप्ट है जो PNG छवि को Base64 स्ट्रिंग में एन्कोड कर सकती है।

मैं जावास्क्रिप्ट का उपयोग करके एक ही काम करना चाहता हूं। मुझे पता है कि फाइलें कैसे खोलें, लेकिन मुझे यकीन नहीं है कि एन्कोडिंग कैसे करें। मुझे बाइनरी डेटा के साथ काम करने की आदत नहीं है।


2
यहाँ जावास्क्रिप्ट का उपयोग करके base64_encode और base64_decode का सर्वोत्तम तरीका है। नीचे दिए गए लिंक देखें। phpjs.org/functions/base64_encode:358 phpjs.org/functions/base64_decode:357
gautamlakum

यहाँ एक और jquery प्लगइन है, जो base64 एनकोड / डिकोड के लिए है
zahid9i

Microjs की जाँच करें: microjs.com/#base64
विनोद श्रीवास्तव

जवाबों:


865

आप बेस 64 एन्कोडिंग से btoa()और इसके atob()लिए उपयोग कर सकते हैं ।

इन कार्यों को स्वीकार / वापसी के बारे में टिप्पणियों में कुछ भ्रम प्रतीत होता है, इसलिए…

  • btoa()एक "स्ट्रिंग" को स्वीकार करता है, जहां प्रत्येक चरित्र 8-बिट बाइट का प्रतिनिधित्व करता है - यदि आप एक स्ट्रिंग युक्त वर्ण पास करते हैं जिसे 8 बिट में प्रस्तुत नहीं किया जा सकता है, तो यह संभवतः टूट जाएगा । यह एक समस्या नहीं है यदि आप वास्तव में स्ट्रिंग को बाइट सरणी के रूप में मान रहे हैं, लेकिन यदि आप कुछ और करने की कोशिश कर रहे हैं तो आपको पहले एनकोड करना होगा।

  • atob()एक "स्ट्रिंग" लौटाता है जहां प्रत्येक वर्ण 8-बिट बाइट का प्रतिनिधित्व करता है - अर्थात, इसका मान 0और के बीच होगा 0xff। इसका मतलब यह नहीं है कि यह ASCII है - संभवतः यदि आप इस फ़ंक्शन का उपयोग कर रहे हैं, तो आप द्विआधारी डेटा के साथ काम करने की उम्मीद करते हैं, न कि पाठ के साथ।

यह सभी देखें:


47
ध्यान दें कि यह वेबकिट ब्राउज़रों के लिए भी काम करता है, जैसे कि सफारी।
डैनियल वॉन फंगे

5
लेकिन यह iOS 4.1 के साथ iPhone3G पर काम नहीं करता है। यह iPhone 4 या iPhone पर सेट होने पर सिम्युलेटर iPhone सिम्युलेटर पर काम करता है।
ग्रांट एम

29
कृपया यूनिकोड स्ट्रिंग्स के लिए विशेष ध्यान दें: developer.mozilla.org/En/DOM/Window.btoa#Unicode_Strings btoa और atob केवल ASCII आधारित स्ट्रिंग्स के लिए ठीक से काम करते हैं। एक अमेरिकी के रूप में, आप शायद एक अंतर नहीं देखेंगे ... लेकिन पहली बार जब आप एक उच्चारण चरित्र का उपयोग करते हैं, तो आपका कोड टूट जाएगा।
दान एस्पेरज़ा

70
btoa(unescape(encodeURIComponent(str))))अगर आपको UFT8 का उपयोग करना चाहिए तो
सेट करें

4
मेरा संपादन देखें, @ ट्रायनको। ये पाठ , अवधि को संसाधित करने के लिए उपयोग करने के लिए अभिप्रेत नहीं हैं ।
शोग ९

289

यहाँ से :

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/
var Base64 = {

// private property
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

// public method for encoding
encode : function (input) {
    var output = "";
    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    var i = 0;

    input = Base64._utf8_encode(input);

    while (i < input.length) {

        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);

        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;

        if (isNaN(chr2)) {
            enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
            enc4 = 64;
        }

        output = output +
        this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
        this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

    }

    return output;
},

// public method for decoding
decode : function (input) {
    var output = "";
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i = 0;

    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

    while (i < input.length) {

        enc1 = this._keyStr.indexOf(input.charAt(i++));
        enc2 = this._keyStr.indexOf(input.charAt(i++));
        enc3 = this._keyStr.indexOf(input.charAt(i++));
        enc4 = this._keyStr.indexOf(input.charAt(i++));

        chr1 = (enc1 << 2) | (enc2 >> 4);
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
        chr3 = ((enc3 & 3) << 6) | enc4;

        output = output + String.fromCharCode(chr1);

        if (enc3 != 64) {
            output = output + String.fromCharCode(chr2);
        }
        if (enc4 != 64) {
            output = output + String.fromCharCode(chr3);
        }

    }

    output = Base64._utf8_decode(output);

    return output;

},

// private method for UTF-8 encoding
_utf8_encode : function (string) {
    string = string.replace(/\r\n/g,"\n");
    var utftext = "";

    for (var n = 0; n < string.length; n++) {

        var c = string.charCodeAt(n);

        if (c < 128) {
            utftext += String.fromCharCode(c);
        }
        else if((c > 127) && (c < 2048)) {
            utftext += String.fromCharCode((c >> 6) | 192);
            utftext += String.fromCharCode((c & 63) | 128);
        }
        else {
            utftext += String.fromCharCode((c >> 12) | 224);
            utftext += String.fromCharCode(((c >> 6) & 63) | 128);
            utftext += String.fromCharCode((c & 63) | 128);
        }

    }

    return utftext;
},

// private method for UTF-8 decoding
_utf8_decode : function (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;
}

}

इसके अलावा, "जावास्क्रिप्ट बेस 64 एन्कोडिंग" पर खोज बहुत सारे अन्य विकल्पों को बदल देती है, ऊपर वाला पहले वाला था।


3
यह तब भी उपयोगी है जब बेस 64 एन्कोडिंग गैर-मानक है; मेरे मामले में "/" चरित्र का उपयोग नहीं किया गया था, और "?" इसके बजाय वर्ण का उपयोग किया गया था, जिसका अर्थ क्रोम एटोब () में भी आने वाले बेस 64 स्ट्रिंग्स को डिकोड नहीं करना था।
क्रिस मोसचिनी

21
इस कोड से सावधान रहें - यह आपके स्ट्रिंग को UTF-8 एन्कोडेड स्ट्रिंग के रूप में व्याख्या करने का प्रयास करता है। हमारे पास एक मामला था जहां हमारे पास एक बाइनरी स्ट्रिंग था (यानी स्ट्रिंग में प्रत्येक चरित्र को एक बाइट के रूप में व्याख्या की जानी चाहिए), और इस कोड ने डेटा को दूषित किया। स्रोत, ल्यूक पढ़ें
डैनियल यांकोव्स्की

11
सभी बाइनरी एन्कोडिंग / डिकोडिंग के लिए इसे सुरक्षित बनाने के लिए आवश्यक है कि string = string.replace(/\r\n/g,"\n");utf8 एन्कोडिंग विधि में संदिग्ध कथन को हटा दें ।
मारियस

7
@ मैरी: मैं सोच रहा हूं कि वे string = string.replace(/\r\n/g,"\n");पहली जगह में शामिल क्यों होंगे , योग्य। यह "ओह" की तरह है, इस स्ट्रिंग को एन्कोड करता है, लेकिन सबसे पहले, हम क्यों नहीं यादृच्छिक रूप से सभी लाइन ब्रेक को बिना किसी अच्छे कारण के सामान्य रूप से सामान्य करते हैं। जिसे सभी परिस्थितियों में वर्ग से बिल्कुल हटा देना चाहिए।
त्रिकोको

2
मैं एक जावास्क्रिप्ट गुरु नहीं हूँ, लेकिन इस कोड में एक बग है: यदि chr2 NaN है, तो इसका मान अभी भी कथन में उपयोग किया जाता है enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);। मेरे ब्राउज़र में यह ठीक काम करता है, NaN>>40 के बराबर है, लेकिन मुझे नहीं पता कि सभी ब्राउज़र ऐसा करते हैं ( NaN/16NaN के बराबर भी )।
Jan

117

इंटरनेट एक्सप्लोरर 10+

// Define the string
var string = 'Hello World!';

// Encode the String
var encodedString = btoa(string);
console.log(encodedString); // Outputs: "SGVsbG8gV29ybGQh"

// Decode the String
var decodedString = atob(encodedString);
console.log(decodedString); // Outputs: "Hello World!"

क्रॉस ब्राउज़र

// Create Base64 Object
var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}

// Define the string
var string = 'Hello World!';

// Encode the String
var encodedString = Base64.encode(string);
console.log(encodedString); // Outputs: "SGVsbG8gV29ybGQh"

// Decode the String
var decodedString = Base64.decode(encodedString);
console.log(decodedString); // Outputs: "Hello World!"

jsFiddle


Node.js के साथ

यहां बताया गया है कि आप Node.js में base64 में सामान्य टेक्स्ट को कैसे एनकोड करते हैं:

//Buffer() requires a number, array or string as the first parameter, and an optional encoding type as the second parameter. 
// Default is utf8, possible encoding types are ascii, utf8, ucs2, base64, binary, and hex
var b = new Buffer('JavaScript');
// If we don't use toString(), JavaScript assumes we want to convert the object to utf8.
// We can make it convert to other formats by passing the encoding type to toString().
var s = b.toString('base64');

और यहां बताया गया है कि आपने बेस 64 एनकोडेड स्ट्रिंग्स को कैसे डिकोड किया है:

var b = new Buffer('SmF2YVNjcmlwdA==', 'base64')
var s = b.toString();

Dojo.js के साथ

Dojox.encoding.base64 का उपयोग करके बाइट्स की एक सरणी को एनकोड करने के लिए:

var str = dojox.encoding.base64.encode(myByteArray);

एक बेस 64-एन्कोडेड स्ट्रिंग को डीकोड करने के लिए:

var bytes = dojox.encoding.base64.decode(str)

bower कोणीय- base64 स्थापित करें

<script src="bower_components/angular-base64/angular-base64.js"></script>

angular
    .module('myApp', ['base64'])
    .controller('myController', [

    '$base64', '$scope', 
    function($base64, $scope) {

        $scope.encoded = $base64.encode('a string');
        $scope.decoded = $base64.decode('YSBzdHJpbmc=');
}]);

3
यह उत्तर मूल कोड पर आधारित है और इसमें अन्य उत्तरों में पोस्ट किए गए उस कोड के अपडेट शामिल नहीं हैं।
यूजीन रयब्त्सेव

प्रस्तावित NodeJS समाधान पदावनत है।
व्लादिमीर नुल

94

"यह" के संदर्भों के कारण IE7 में टूटने के अलावा सनी का कोड बहुत अच्छा है। "बेस 64" के साथ इस तरह के संदर्भों को बदलकर फिक्स्ड:

var Base64 = {
// private property
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

// public method for encoding
encode : function (input) {
    var output = "";
    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    var i = 0;

    input = Base64._utf8_encode(input);

    while (i < input.length) {

        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);

        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;

        if (isNaN(chr2)) {
            enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
            enc4 = 64;
        }

        output = output +
        Base64._keyStr.charAt(enc1) + Base64._keyStr.charAt(enc2) +
        Base64._keyStr.charAt(enc3) + Base64._keyStr.charAt(enc4);

    }

    return output;
},

// public method for decoding
decode : function (input) {
    var output = "";
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i = 0;

    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

    while (i < input.length) {

        enc1 = Base64._keyStr.indexOf(input.charAt(i++));
        enc2 = Base64._keyStr.indexOf(input.charAt(i++));
        enc3 = Base64._keyStr.indexOf(input.charAt(i++));
        enc4 = Base64._keyStr.indexOf(input.charAt(i++));

        chr1 = (enc1 << 2) | (enc2 >> 4);
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
        chr3 = ((enc3 & 3) << 6) | enc4;

        output = output + String.fromCharCode(chr1);

        if (enc3 != 64) {
            output = output + String.fromCharCode(chr2);
        }
        if (enc4 != 64) {
            output = output + String.fromCharCode(chr3);
        }

    }

    output = Base64._utf8_decode(output);

    return output;

},

// private method for UTF-8 encoding
_utf8_encode : function (string) {
    string = string.replace(/\r\n/g,"\n");
    var utftext = "";

    for (var n = 0; n < string.length; n++) {

        var c = string.charCodeAt(n);

        if (c < 128) {
            utftext += String.fromCharCode(c);
        }
        else if((c > 127) && (c < 2048)) {
            utftext += String.fromCharCode((c >> 6) | 192);
            utftext += String.fromCharCode((c & 63) | 128);
        }
        else {
            utftext += String.fromCharCode((c >> 12) | 224);
            utftext += String.fromCharCode(((c >> 6) & 63) | 128);
            utftext += String.fromCharCode((c & 63) | 128);
        }

    }

    return utftext;
},

// private method for UTF-8 decoding
_utf8_decode : function (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;
}
}

4
ओह मेरी बुर, मैं ब्राउज़र URL से इनपुट ले रहा था; कहाँ | % 7C में बदल जाता है; इसलिए एन्कोडिंग भी गलत है।
कानागावेलु सुगुमार

मुझे पता है कि यह वास्तव में पुराना है, लेकिन मैंने इस फ़ंक्शन को एक से अधिक स्थानों पर उपयोग किया है, कुंजी स्ट्रिंग वास्तव में 65 वर्णों पर है, 64 नहीं। स्ट्रिंग मानक कल्पना नहीं है, मुझे यकीन नहीं है कि यह मायने रखता है, लेकिन सिर्फ सोच रहा था अगर ये हो?
जोनाथन वैगनर

"सख्त का उपयोग करें"; वह है जो 'इस' और अन्य प्रकार के तत्वों को तोड़ता है जैसे 'के साथ' और मैंने जो पढ़ा है, उससे 'निष्कासन' को कोसना बंद हो जाता है। दुरुपयोग पर सभी गलत विचार। व्यक्तिगत रूप से मैं यह नहीं देखता कि जावास्क्रिप्ट को अपने रास्ते से नीचे जाने की आवश्यकता क्यों है, यह कभी भी एक कार्यक्रम को कसकर बाध्य करने के लिए नहीं था और पहले से ही अधिक जटिल बना दिया गया था। यदि आप बाध्य होना चाहते हैं तो जावास्क्रिप्ट के लिए एक कंपाइलर बनाएं।
मार्क जिबलिन

मैं इस फ़ंक्शन का उपयोग करने का प्रयास करता हूं और मुझे त्रुटि प्राप्त होती है: इसके कारण: org.mozilla.javascript.EcmaError: TypeError: ऑब्जेक्ट टेस्टी टेस्टी टेस्टी में फ़ंक्शन को प्रतिस्थापित नहीं कर सकता। किसी को पता है कि यह त्रुटि क्यों?
पीआरवीएस

@JonathanWagner - सामान्य एन्कोडिंग के लिए उपयोग किए जाने वाले 64 वर्ण हैं। 65 वें वर्ण का उपयोग उन्हें पैडिंग के रूप में किया जाता है। इनपुट स्ट्रिंग में 3 से विभाज्य वर्ण नहीं होते हैं
किकस्टार्ट

90

आप btoa(बेस -64 के लिए) और atob(बेस -64 से) का उपयोग कर सकते हैं ।

IE 9 और नीचे के लिए, jquery-base64 प्लगइन का प्रयास करें :

$.base64.encode("this is a test");
$.base64.decode("dGhpcyBpcyBhIHRlc3Q=");

133
सब कुछ एक jQuery प्लगइन की आवश्यकता क्यों है: c यह सिर्फ कोर जावास्क्रिप्ट कार्यक्षमता है इसका DOM या jQuery से कोई लेना-देना नहीं है
EaterOfCode

38
यह एक मुख्य कार्यशीलता नहीं है या इसमें कई अलग-अलग उच्च मत वाले उत्तर नहीं होंगे (जिसमें डू-इट-योर-टीएल, डॉ कोड भी शामिल है)। तो, यह वास्तव में jQuery के लिए एक अच्छा उपयोग मामला है (एक लाइनर, Android के WebView में भी काम करने की उम्मीद) - और भी अधिक अगर यह पहले से ही एक निर्भरता है।
रिसादिंह

1
मैं इस तरह कोड स्निपेट्स को jQuery में मुख्य रूप से स्थापित करना पसंद करता हूं क्योंकि वे एक नियंत्रित नाम स्थान में मौजूद होंगे। यदि आप एएमडी या कॉमनजेस या इसी तरह के डिजाइन पैटर्न का उपयोग नहीं कर रहे हैं, तो आपके वैश्विक नामस्थान के लिए यादृच्छिक कार्यों के समूह के साथ वास्तव में गड़बड़ करना आसान है।
sffc

9
@Risadinha - इसकी कार्यक्षमता को छोड़कर कुछ भी jQuery पर निर्भर नहीं करता है या इसका विस्तार नहीं करता है ... शाब्दिक रूप से इसके कोड में jQuery के केवल संदर्भ इसे jQuery ऑब्जेक्ट के साथ जोड़ रहे हैं ... तो jQuery से इसे संलग्न करने का क्या मतलब है और इसलिए आवश्यकता है jQuery का उपयोग करने के लिए? बस इसे स्वयं बनाएं 1 लाइनर base64.encode(...)और base64.decode(...)... इसे jQuery के साथ संलग्न करने पर जब यह शून्य jQuery के विशिष्ट कार्यक्षमता है, तो बिल्कुल कोई मतलब नहीं है ...
जिम्बो जॉनी

1
jQuery का अनुरोध नहीं किया गया था। सादे पुराने जेएस प्रश्न का कोई मान्य उत्तर नहीं।
मेटाक्लोन

34

स्वीकृत उत्तर के नीचे टिप्पणियों (SET और स्टीफन स्टीगर द्वारा) से, यहां एक त्वरित सारांश है कि कैसे एक पुस्तकालय की आवश्यकता के बिना base64 से / से एक स्ट्रिंग को एन्कोड / डिकोड किया जाए।

str = "The quick brown fox jumps over the lazy dog";
b64 = btoa(unescape(encodeURIComponent(str)));
str = decodeURIComponent(escape(window.atob(b64)));

डेमो

(jQuery लाइब्रेरी का उपयोग करता है, लेकिन एनकोड / डिकोड के लिए नहीं)


पुष्टि करने के लिए, यह UTF-8 वर्णों का समर्थन करता है?
क्रैशहॉल

1
@ चरसालोट मुझे एहसास है कि यह दो साल बहुत देर हो चुकी है, लेकिन हाँ यह करता है। मैं यह भी महसूस कर रहा हूं कि मैं यह टाइप करता हूं कि आपने एक संपादन प्रदान किया है जो संभवतः UTF8 काम करता है।
सायंकाल

यहां किसी के लिए भी Node.js के साथ उपयोग करने के लिए एक अच्छा समाधान की तलाश है, मैं इस काम की पुष्टि कर सकता हूं। नोड में डिकोडिंग के लिए, मैंने उपयोग किया:Buffer.from(b64data, 'base64').toString();
ट्रेक

26

के कार्यान्वयन में दोनों बग की एक जोड़ी है _utf8_decodec1और बयान के c2टूटे हुए उपयोग के कारण वैश्विक चर के रूप में असाइन किया गया है var, और c3इसे आरंभीकृत या घोषित नहीं किया गया है।

यह काम करता है, लेकिन ये चर किसी भी मौजूदा वाले को इस फ़ंक्शन के बाहर एक ही नाम के साथ अधिलेखित कर देंगे।

यहाँ एक संस्करण है जो ऐसा नहीं करेगा:

// private method for UTF-8 decoding
_utf8_decode : function (utftext) {
    var string = "";
    var i = 0;
    var c = 0, c1 = 0, c2 = 0;

    while ( i < utftext.length ) {

        c = utftext.charCodeAt(i);

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

    }
    return string;
}

9
2011 में जब मैंने यह उत्तर लिखा था ... तब तक मेरे पास जवाबों को संपादित करने के लिए पर्याप्त प्रतिनिधि नहीं था।
डकैती

2
IE7? मुझे लगता है कि हमें उस के लिए कोड लिखने के लिए समय बर्बाद करना बंद कर देना चाहिए, लोग इस पुरानी तकनीक का उपयोग करना बंद नहीं करेंगे जब तक कि हम डेवलपर्स उन्हें मजबूर न करें!
रामी दबैन

@RonanDejhero IE7 में काम नहीं करता है? मुझे याद नहीं कि मैंने उस विशेष ब्राउज़र में परीक्षण किया था।
robbles

1
मेरा क्या मतलब था कि अगर यह IE7 में काम नहीं करता है, तो किसी को परवाह नहीं करनी चाहिए! मैंने परीक्षण नहीं किया और इसका परीक्षण नहीं करूंगा :)
रामी दबैन

16

I + 1'ed सनी का जवाब है, लेकिन मैं अपने स्वयं के प्रोजेक्ट के लिए किए गए कुछ बदलावों में योगदान करना चाहता था यदि किसी को यह उपयोगी लगे। मूल रूप से मैंने अभी मूल कोड को थोड़ा साफ किया है, इसलिए जेएसएलआईएनटी ने काफी शिकायत नहीं की है, और मैंने टिप्पणियों में निजी के रूप में चिह्नित तरीकों को वास्तव में निजी बना दिया है। मैंने अपने स्वयं के प्रोजेक्ट में दो विधियों को भी जोड़ा, अर्थात् decodeToHexऔर encodeFromHex

कोड:

var Base64 = (function() {
    "use strict";

    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    var _utf8_encode = function (string) {

        var utftext = "", c, n;

        string = string.replace(/\r\n/g,"\n");

        for (n = 0; n < string.length; n++) {

            c = string.charCodeAt(n);

            if (c < 128) {

                utftext += String.fromCharCode(c);

            } else if((c > 127) && (c < 2048)) {

                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);

            } else {

                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);

            }

        }

        return utftext;
    };

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

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {

                string += String.fromCharCode(c);
                i++;

            } else if((c > 191) && (c < 224)) {

                c1 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c1 & 63));
                i += 2;

            } else {

                c1 = utftext.charCodeAt(i+1);
                c2 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63));
                i += 3;

            }

        }

        return string;
    };

    var _hexEncode = function(input) {
        var output = '', i;

        for(i = 0; i < input.length; i++) {
            output += input.charCodeAt(i).toString(16);
        }

        return output;
    };

    var _hexDecode = function(input) {
        var output = '', i;

        if(input.length % 2 > 0) {
            input = '0' + input;
        }

        for(i = 0; i < input.length; i = i + 2) {
            output += String.fromCharCode(parseInt(input.charAt(i) + input.charAt(i + 1), 16));
        }

        return output;
    };

    var encode = function (input) {
        var output = "", chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0;

        input = _utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output += _keyStr.charAt(enc1);
            output += _keyStr.charAt(enc2);
            output += _keyStr.charAt(enc3);
            output += _keyStr.charAt(enc4);

        }

        return output;
    };

    var decode = function (input) {
        var output = "", chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = _keyStr.indexOf(input.charAt(i++));
            enc2 = _keyStr.indexOf(input.charAt(i++));
            enc3 = _keyStr.indexOf(input.charAt(i++));
            enc4 = _keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output += String.fromCharCode(chr1);

            if (enc3 !== 64) {
                output += String.fromCharCode(chr2);
            }
            if (enc4 !== 64) {
                output += String.fromCharCode(chr3);
            }

        }

        return _utf8_decode(output);
    };

    var decodeToHex = function(input) {
        return _hexEncode(decode(input));
    };

    var encodeFromHex = function(input) {
        return encode(_hexDecode(input));
    };

    return {
        'encode': encode,
        'decode': decode,
        'decodeToHex': decodeToHex,
        'encodeFromHex': encodeFromHex
    };
}());

मैंने शुरू में सोचा था कि अलग-अलग वक्तव्यों में आउटपुट कॉनट्रैक्शन को अनियंत्रित करना अधिक इष्टतम होगा, लेकिन एक सेकंड के लिए इसके बारे में सोचने के बाद, यह अधिक अक्षम होना चाहिए क्योंकि जावास्क्रिप्ट स्ट्रिंग्स अपरिवर्तनीय हैं और यह काम करते समय संभावित विशाल डेटा की 4 प्रतियों का कारण होगा। बड़ी बाइनरी डेटा फ़ाइलों के साथ। यह पहले एक साथ 4 वर्णों को समेटने और फिर एक नया तार बनाने के लिए एक सुरक्षित शर्त है। काश मैं एक बेहतर स्ट्रिंग बिल्डिंग विधि के बारे में जानता जो सभी प्लेटफार्मों पर कुशल होना सुनिश्चित करता। (यहां तक ​​कि IE6)
Marius

मैंने मूल रूप से पोस्ट किए गए कोड के अपने क्लीनअप में प्रदर्शन पर विचार नहीं किया है। मैंने अभी इसे अधिक पठनीय बनाया और मूल रूप में टिप्पणियों में निजी के रूप में चिह्नित तरीकों को प्रकट मॉड्यूल पैटर्न का उपयोग करके वास्तव में निजी होना चाहिए। मुझे यकीन है कि प्रदर्शन के संबंध में भी इसे अनुकूलित किया जा सकता है। यह सुनिश्चित नहीं है कि कब कचरा संग्रह यहां पर होगा, और जावास्क्रिप्ट के माध्यम से बड़ी फ़ाइलों को हैशिंग बहुत आम नहीं है (या वास्तव में किसी भी मामले में इष्टतम समाधान नहीं है)।
जो डायनाले

मजेदार है कि यह कोड किस तरह से यहां रहता है। इस पृष्ठ पर पहले से ही इसके 3 अलग-अलग संस्करण हैं।
gregn3

15

नए ब्राउज़रों के लिए Uint8Array को स्ट्रिंग में एन्कोड करें, और स्ट्रिंग को Uint8Array में डिकोड करें।

const base64 = {
    decode: s => Uint8Array.from(atob(s), c => c.charCodeAt(0)),
    encode: b => btoa(String.fromCharCode(...new Uint8Array(b)))
};

Node.js के लिए आप स्ट्रिंग, बफ़र, या Uint8Array को स्ट्रिंग में एन्कोड करने के लिए, और string, Buffer, या Uint8Array से बफ़र को एनकोड करने के लिए उपयोग कर सकते हैं।

const base64 = {
    decode: s => Buffer.from(s, 'base64'),
    encode: b => Buffer.from(b).toString('base64')
};

13

Base64 एन्कोडेड स्ट्रिंग URL को फ्रेंडली बनाने के लिए, जावास्क्रिप्ट में आप कुछ इस तरह से कर सकते हैं:

// if this is your Base64 encoded string
var str = 'VGhpcyBpcyBhbiBhd2Vzb21lIHNjcmlwdA=='; 

// make URL friendly:
str = str.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, '');

// reverse to original encoding
str = (str + '===').slice(0, str.length + (str.length % 4));
str = str.replace(/-/g, '+').replace(/_/g, '/');

इस फिडेल को भी देखें: http://jsfiddle.net/magikMaker/7bjaT/


9
मैं विनम्रतापूर्वक सुझाव देता हूं कि encodeURIComponentडेवलपर के हिस्से पर प्रयास के कम खर्च के साथ बेहतर परिणाम हो सकता है।
पाब्लो फर्नांडीज

11
encodeURIComponent बेस 64 एन्कोडेड स्ट्रिंग्स की लंबाई को बदल देगा, और '+' और '_' के साथ '+' और '/' की जगह URLs में बेस 64 का उपयोग करते समय मानक अभ्यास है (जैसे docs.python.org/bibrary/base64.html#base64 .urlsafe_b64encode )। परेशान होने की जरूरत नहीं है।
natevw

12

कृपया ध्यान दें कि यह कच्चे यूनिकोड के तारों के लिए उपयुक्त नहीं है! यहां यूनिकोड अनुभाग देखें ।

एन्कोडिंग के लिए सिंटैक्स

var encodedData = window.btoa(stringToEncode);

डिकोडिंग के लिए सिंटैक्स

var decodedData = window.atob(encodedData);


1
यूनिकोड अनुभाग का सीधा लिंक: developer.mozilla.org/en-US/docs/Web/API/…
TomTasche

12

हाथ से मैं फिर से लिखा है, इन एन्कोडिंग और पार मंच / ब्राउज़र संगतता के लिए और भी वास्तविक निजी scoping के साथ एक मॉड्यूलर प्रारूप में हेक्साडेसिमल एक के अपवाद के साथ तरीकों डिकोडिंग, और का उपयोग करता है btoaऔर atobवे बजाय गति के कारण मौजूद हैं, तो उपयोग इसकी अपनी एन्कोडिंग:

https://gist.github.com/Nijikokun/5192472

उपयोग:

base64.encode(/* String */);
base64.decode(/* String */);

utf8.encode(/* String */);
utf8.decode(/* String */);

12

यह सवाल है और यह जवाब मुझे सही दिशा की ओर इशारा करता है।
विशेष रूप से यूनिकोड एटब और बोटो के साथ "वेनिला" का उपयोग नहीं किया जा सकता है और इन दिनों हर जगह यूनिकोड है।

मोज़िला से सीधे, इस उद्देश्य के लिए दो अच्छे कार्य (यूनिकोड और HTML टैग के साथ परीक्षण किए गए)

function b64EncodeUnicode(str) {
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
        return String.fromCharCode('0x' + p1);
    }));
}

b64EncodeUnicode('✓ à la mode'); // "4pyTIMOgIGxhIG1vZGU="
b64EncodeUnicode('\n'); // "Cg=="



function b64DecodeUnicode(str) {
    return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));
}

b64DecodeUnicode('4pyTIMOgIGxhIG1vZGU='); // "✓ à la mode"
b64DecodeUnicode('Cg=='); // "\n"

ये कार्य कस्टम बेस जावास्क्रिप्ट फ़ंक्शन का उपयोग करके कच्चे बेस64 डिकोडिंग की तुलना में बिजली की तेजी से प्रदर्शन करेंगे, जैसे कि बोटो और एटोब इंटरप्रेटर के बाहर निष्पादित किए जाते हैं।

यदि आप पुराने IE और पुराने मोबाइल फोन (जैसे iphone 3?) को अनदेखा कर सकते हैं तो यह एक अच्छा उपाय होना चाहिए।


10

यदि आपको HTML छवि ऑब्जेक्ट को एन्कोड करना है, तो आप सरल फ़ंक्शन लिख सकते हैं जैसे:

function getBase64Image(img) {  
  var canvas = document.createElement("canvas");  
  canvas.width = img.width;  
  canvas.height = img.height;  
  var ctx = canvas.getContext("2d");  
  ctx.drawImage(img, 0, 0);  
  var dataURL = canvas.toDataURL("image/png");  
  // escape data:image prefix
  return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");  
  // or just return dataURL
  // return dataURL
}  

आईडी द्वारा छवि का आधार 64 पाने के लिए:

function getBase64ImageById(id){  
  return getBase64Image(document.getElementById(id));  
} 

अधिक यहाँ


हां, और var img = new Image (); img.src = "../images/myPic.png";
pdschuller

7

मैं इसके लिए वर्तमान में उपयोग कर रहा है कि window.atob+ के लिए एक minified polyfill के साथ योगदान window.btoa

(function(){function t(t){this.message=t}var e="undefined"!=typeof exports?exports:this,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.prototype=Error(),t.prototype.name="InvalidCharacterError",e.btoa||(e.btoa=function(e){for(var o,n,a=0,i=r,c="";e.charAt(0|a)||(i="=",a%1);c+=i.charAt(63&o>>8-8*(a%1))){if(n=e.charCodeAt(a+=.75),n>255)throw new t("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");o=o<<8|n}return c}),e.atob||(e.atob=function(e){if(e=e.replace(/=+$/,""),1==e.length%4)throw new t("'atob' failed: The string to be decoded is not correctly encoded.");for(var o,n,a=0,i=0,c="";n=e.charAt(i++);~n&&(o=a%4?64*o+n:n,a++%4)?c+=String.fromCharCode(255&o>>(6&-2*a)):0)n=r.indexOf(n);return c})})();

6

मैं CryptoJS से बेस 64 एनकोड / डिकोड विधियों का उपयोग करना चाहूंगा , सर्वोत्तम प्रथाओं और पैटर्न का उपयोग करके जावास्क्रिप्ट में कार्यान्वित मानक और सुरक्षित क्रिप्टोग्राफ़िक एल्गोरिदम के लिए सबसे लोकप्रिय पुस्तकालय।


6

यहाँ @ user850789 के एक का AngularJS फ़ैक्टरी संस्करण है:

'use strict';

var ProjectNameBase64Factory = angular.module('project_name.factories.base64', []);

ProjectNameBase64Factory.factory('Base64', function () {
    var Base64 = {
        // private property
        _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

        // public method for encoding
        encode: function (input) {
            var output = "";
            var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
            var i = 0;

            input = Base64._utf8_encode(input);

            while (i < input.length) {

                chr1 = input.charCodeAt(i++);
                chr2 = input.charCodeAt(i++);
                chr3 = input.charCodeAt(i++);

                enc1 = chr1 >> 2;
                enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                enc4 = chr3 & 63;

                if (isNaN(chr2)) {
                    enc3 = enc4 = 64;
                } else if (isNaN(chr3)) {
                    enc4 = 64;
                }

                output = output +
                         Base64._keyStr.charAt(enc1) + Base64._keyStr.charAt(enc2) +
                         Base64._keyStr.charAt(enc3) + Base64._keyStr.charAt(enc4);

            }

            return output;
        },

        // public method for decoding
        decode: function (input) {
            var output = "";
            var chr1, chr2, chr3;
            var enc1, enc2, enc3, enc4;
            var i = 0;

            input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

            while (i < input.length) {

                enc1 = Base64._keyStr.indexOf(input.charAt(i++));
                enc2 = Base64._keyStr.indexOf(input.charAt(i++));
                enc3 = Base64._keyStr.indexOf(input.charAt(i++));
                enc4 = Base64._keyStr.indexOf(input.charAt(i++));

                chr1 = (enc1 << 2) | (enc2 >> 4);
                chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                chr3 = ((enc3 & 3) << 6) | enc4;

                output = output + String.fromCharCode(chr1);

                if (enc3 != 64) {
                    output = output + String.fromCharCode(chr2);
                }
                if (enc4 != 64) {
                    output = output + String.fromCharCode(chr3);
                }

            }

            output = Base64._utf8_decode(output);

            return output;

        },

        // private method for UTF-8 encoding
        _utf8_encode: function (string) {
            string = string.replace(/\r\n/g, "\n");
            var utftext = "";

            for (var n = 0; n < string.length; n++) {

                var c = string.charCodeAt(n);

                if (c < 128) {
                    utftext += String.fromCharCode(c);
                }
                else if ((c > 127) && (c < 2048)) {
                    utftext += String.fromCharCode((c >> 6) | 192);
                    utftext += String.fromCharCode((c & 63) | 128);
                }
                else {
                    utftext += String.fromCharCode((c >> 12) | 224);
                    utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                    utftext += String.fromCharCode((c & 63) | 128);
                }

            }

            return utftext;
        },

        // private method for UTF-8 decoding
        _utf8_decode: function (utftext) {
            var string = "";
            var i = 0;
            var c = 0, c2 = 0, c3 = 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;
        }
    };
    return Base64;
});

6

मैं एक परियोजना के लिए base64 के रूप में UTF-8 स्ट्रिंग के एन्कोडिंग की आवश्यकता थी। यहाँ अधिकांश उत्तर यूटीएफ -16 सरोगेट जोड़े को ठीक से संभालने के लिए नहीं लगते हैं, जब यूटीएफ -8 में परिवर्तित किया जाता है, तो पूरा होने के लिए, मैं अपना समाधान पोस्ट करूंगा:

function strToUTF8Base64(str) {

    function decodeSurrogatePair(hi, lo) {
        var resultChar = 0x010000;
        resultChar += lo - 0xDC00;
        resultChar += (hi - 0xD800) << 10;
        return resultChar;
    }

    var bytes = [0, 0, 0];
    var byteIndex = 0;
    var result = [];

    function output(s) {
        result.push(s);
    }

    function emitBase64() {

        var digits =
                'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
                'abcdefghijklmnopqrstuvwxyz' +
                '0123456789+/';

        function toDigit(value) {
            return digits[value];
        }

        // --Byte 0--    --Byte 1--    --Byte 2--
        // 1111  1122    2222  3333    3344  4444

        var d1 = toDigit(bytes[0] >> 2);
        var d2 = toDigit(
            ((bytes[0] & 0x03) << 4) |
            (bytes[1] >> 4));
        var d3 = toDigit(
            ((bytes[1] & 0x0F) << 2) |
            (bytes[2] >> 6));
        var d4 = toDigit(
            bytes[2] & 0x3F);

        if (byteIndex === 1) {
            output(d1 + d2 + '==');
        }
        else if (byteIndex === 2) {
            output(d1 + d2 + d3 + '=');
        }
        else {
            output(d1 + d2 + d3 + d4);
        }
    }

    function emit(chr) {
        bytes[byteIndex++] = chr;
        if (byteIndex == 3) {
            emitBase64();
            bytes[0] = 0;
            bytes[1] = 0;
            bytes[2] = 0;
            byteIndex = 0;
        }
    }

    function emitLast() {
        if (byteIndex > 0) {
            emitBase64();
        }
    }

    // Converts the string to UTF8:

    var i, chr;
    var hi, lo;
    for (i = 0; i < str.length; i++) {
        chr = str.charCodeAt(i);

        // Test and decode surrogate pairs in the string
        if (chr >= 0xD800 && chr <= 0xDBFF) {
            hi = chr;
            lo = str.charCodeAt(i + 1);
            if (lo >= 0xDC00 && lo <= 0xDFFF) {
                chr = decodeSurrogatePair(hi, lo);
                i++;
            }
        }

        // Encode the character as UTF-8.
        if (chr < 0x80) {
            emit(chr);
        }
        else if (chr < 0x0800) {
            emit((chr >> 6) | 0xC0);
            emit(((chr >> 0) & 0x3F) | 0x80);
        }
        else if (chr < 0x10000) {
            emit((chr >> 12) | 0xE0);
            emit(((chr >>  6) & 0x3F) | 0x80);
            emit(((chr >>  0) & 0x3F) | 0x80);
        }
        else if (chr < 0x110000) {
            emit((chr >> 18) | 0xF0);
            emit(((chr >> 12) & 0x3F) | 0x80);
            emit(((chr >>  6) & 0x3F) | 0x80);
            emit(((chr >>  0) & 0x3F) | 0x80);
        }
    }

    emitLast();

    return result.join('');
}

ध्यान दें कि कोड का पूरी तरह से परीक्षण नहीं किया गया है। मैंने कुछ इनपुट्स का परीक्षण किया, जिसमें strToUTF8Base64('衠衢蠩蠨')ऑनलाइन एन्कोडिंग टूल ( https://www.base64encode.org/ ) के आउटपुट के साथ तुलना और तुलना करना शामिल है ।


5

अपनी परियोजना के लिए मुझे अभी भी IE7 का समर्थन करने और एन्कोड करने के लिए बड़े इनपुट के साथ काम करने की आवश्यकता है।

जो डायंडले द्वारा प्रस्तावित कोड के आधार पर और जैसा कि मारियस द्वारा टिप्पणी में सुझाया गया है, स्ट्रिंग के बजाय एक सरणी के साथ परिणाम का निर्माण करके IE7 के साथ प्रदर्शन में सुधार करना संभव है।

यहाँ सांकेतिक शब्दों में बदलना के लिए उदाहरण है:

var encode = function (input) {
    var output = [], chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0;

    input = _utf8_encode(input);

    while (i < input.length) {

        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);

        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;

        if (isNaN(chr2)) {
            enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
            enc4 = 64;
        }

        output.push(_keyStr.charAt(enc1));
        output.push(_keyStr.charAt(enc2));
        output.push(_keyStr.charAt(enc3));
        output.push(_keyStr.charAt(enc4));

    }

    return output.join("");
};

5

थोड़ा और काम करते हुए, यदि आप एक उच्च प्रदर्शन देशी समाधान चाहते हैं तो कुछ HTML5 फ़ंक्शन हैं जिनका आप उपयोग कर सकते हैं।

यदि आप अपना डेटा एक में प्राप्त कर सकते हैं Blob, तो आप URL प्राप्त करने के लिए FileReader.readAsDataURL () फ़ंक्शन का उपयोग कर सकते हैं data://और बेस 64 डेटा पर प्राप्त करने के लिए इसके सामने को काट सकते हैं।

हालाँकि आपको डेटा को urldecode करने के लिए आगे की प्रक्रिया करनी पड़ सकती है, क्योंकि मुझे यकीन नहीं है कि +वर्ण data://URL के लिए बच गए हैं या नहीं , लेकिन यह बहुत तुच्छ होना चाहिए।


5

ठीक है, अगर आप डोजो का उपयोग कर रहे हैं, तो यह हमें बेस 64 में एनकोड या डिकोड करने का सीधा रास्ता देता है।

इसे इस्तेमाल करे:-

Dojox.encoding.base64 का उपयोग करके बाइट्स की एक सरणी को एनकोड करने के लिए:

var str = dojox.encoding.base64.encode(myByteArray);

एक बेस 64-एन्कोडेड स्ट्रिंग को डीकोड करने के लिए:

var bytes = dojox.encoding.base64.decode(str);

3

आप का उपयोग कर सकते हैं window.btoaऔर window.atob...

const encoded = window.btoa('Alireza Dezfoolian'); // encode a string
const decoded = window.atob(encoded); // decode the string

संभवतः जिस तरीके से एमडीएन आपके काम को बेहतरीन तरीके से कर सकता है ... यूनिकोड को स्वीकार करना ... इन दो सरल कार्यों का उपयोग करना:

// ucs-2 string to base64 encoded ascii
function utoa(str) {
    return window.btoa(unescape(encodeURIComponent(str)));
}
// base64 encoded ascii to ucs-2 string
function atou(str) {
    return decodeURIComponent(escape(window.atob(str)));
}
// Usage:
utoa('✓ à la mode'); // 4pyTIMOgIGxhIG1vZGU=
atou('4pyTIMOgIGxhIG1vZGU='); // "✓ à la mode"

utoa('I \u2661 Unicode!'); // SSDimaEgVW5pY29kZSE=
atou('SSDimaEgVW5pY29kZSE='); // "I ♡ Unicode!"

3

यहाँ एक LIVE DEMO है atob()और btoa()JS कार्य में बनाया गया है:

<!DOCTYPE html>
<html>
  <head>
    <style>
      textarea{
        width:30%;
        height:100px;
      }
    </style>
    <script>
      // encode string to base64
      function encode()
      {
        var txt = document.getElementById("txt1").value;
        var result = btoa(txt);
        document.getElementById("txt2").value = result;
      }
      // decode base64 back to original string
      function decode()
      {
        var txt = document.getElementById("txt3").value;
        var result = atob(txt);
        document.getElementById("txt4").value = result;
      }
    </script>
  </head>
  <body>
    <div>
      <textarea id="txt1">Some text to decode
      </textarea>
    </div>
    <div>
      <input type="button" id="btnencode" value="Encode" onClick="encode()"/>
    </div>
    <div>
      <textarea id="txt2">
      </textarea>
    </div>
    <br/>
    <div>
      <textarea id="txt3">U29tZSB0ZXh0IHRvIGRlY29kZQ==
      </textarea>
    </div>
    <div>
      <input type="button" id="btndecode" value="Decode" onClick="decode()"/>
    </div>
    <div>
      <textarea id="txt4">
      </textarea>
    </div>
  </body>
</html>

2

Js-base64 लाइब्रेरी का उपयोग करें

btoa () emojis के साथ काम नहीं करता है

var str = "I was funny 😂";
console.log("Original string:", str);

var encodedStr = Base64.encode(str)
console.log("Encoded string:", encodedStr);

var decodedStr = Base64.decode(encodedStr)
console.log("Decoded string:", decodedStr);
<script src="https://cdn.jsdelivr.net/npm/js-base64@2.5.2/base64.min.js"></script>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.