Base64 एन्कोडिंग और क्लाइंट साइड जावास्क्रिप्ट में डिकोडिंग


270

क्या जावास्क्रिप्ट में ऐसी कोई विधियाँ हैं जिनका उपयोग आधारभूत एन्कोडिंग का उपयोग करके एक स्ट्रिंग को एनकोड और डिकोड करने के लिए किया जा सकता है?



जवाबों:


213

कुछ ब्राउज़र जैसे फ़ायरफ़ॉक्स, क्रोम, सफारी, ओपेरा और IE10 + मूल रूप से Base64 को संभाल सकते हैं। इस Stackoverflow प्रश्न पर एक नज़र डालें । यह उपयोग कर रहा है btoa()और atob()कार्य करता है

सर्वर-साइड जावास्क्रिप्ट (नोड) के लिए, आप Buffers को डिकोड कर सकते हैं ।

यदि आप एक क्रॉस-ब्राउज़र समाधान के लिए जा रहे हैं, तो मौजूदा लाइब्ररी हैं जैसे क्रिप्टोजेएस या कोड:

http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html

उत्तरार्द्ध के साथ, आपको क्रॉस ब्राउज़र संगतता के लिए फ़ंक्शन का पूरी तरह से परीक्षण करने की आवश्यकता है। और त्रुटि की सूचना पहले ही दी जा चुकी है


1
मैंने इस पद्धति का उपयोग आधार U64 योजना के साथ बेस 64 में एक एसवीजी को एनकोड करने के लिए किया। आश्चर्य: यह फ़ंक्शन प्रत्येक वर्ण को दिखाता है, इसलिए मुझे यह विकृत XML लक्ष्य पर मिलता है:% 3C% 3Fxml% 20version% 3D% 271.0% 27% 20% 3F% 3E% 3Cvg 20xmlns% 3D% 27http% ...
Dereckson

21
Node.js मूल रूप से Base64 कर सकते हैं: new Buffer('Hello, world!').toString('base64'); new Buffer('SGVsbG8sIHdvcmxkIQ==', 'base64').toString('ascii'); (स्रोत)
nyuszika7h

और अगर मैं इसे URL- सुरक्षित करना चाहता था?
औरदेरो

1
नोड 5+ में, बफ़र का उपयोग करें new Buffer(string)Buffer.from(jwt.split('.')[1], 'base64').toString()
रे फॉस

63

गेको / वेबिट-आधारित ब्राउज़रों (फ़ायरफ़ॉक्स, क्रोम और सफारी) और ओपेरा में, आप btoa () और atob () का उपयोग कर सकते हैं ।

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


यह एक जीवन रक्षक है। मैंने बहुत बड़े बेस 64 एनकोडेड स्ट्रिंग्स को डीकोड करने के लिए कुछ अलग कार्यान्वयन का उपयोग किया और परिणाम हमेशा गलत था। () महान काम करता है!
b2238488

15
छोटा नाइटपिक: ओपेरा जेको या वेबकिट पर आधारित नहीं है, यह अपने स्वयं के प्रतिपादन इंजन का उपयोग करता है जिसे प्रेस्टो कहा जाता है।
पीटर ओल्सन

वाह, इसके लिए धन्यवाद। नहीं पता था कि इन ब्राउज़रों में एक देशी base64 एनकोडर था!
रॉब पोर्टर

5
@PeterOlson अब और नहीं :)
मुस्तफा

1
मुझे लगता है कि यह एक पुरानी पोस्ट है, लेकिन @ b2238488 की चिंता के बारे में, आप बेस 64 स्ट्रिंग को विभाजित कर सकते हैं ताकि प्रत्येक टोकन की लंबाई 4 से अधिक हो, और उन्हें अलग से डिकोड करें। परिणाम एक ही बार में पूरे स्ट्रिंग को डीकोड करने के समान होगा।
nyuszika7h

56

इंटरनेट एक्सप्लोरर 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!"

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

AMD, CommonJS, Nodejs और Browsers के लिए पुन: लिखित और संशोधित UTF-8 और Base64 जावास्क्रिप्ट एनकोडिंग और डिकोडिंग लाइब्रेरी / मॉड्यूल। क्रॉस-ब्राउज़र संगत।


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=');
}]);

पर कैसे?

यदि आप इस बारे में अधिक जानना चाहते हैं कि बेस 64 को सामान्य रूप से कैसे एन्कोड किया गया है, और जावास्क्रिप्ट में विशेष रूप से, मैं इस लेख की सिफारिश करूंगा: जावास्क्रिप्ट में कंप्यूटर विज्ञान: बेस 64 एनकोडिंग


1
FYI करें: क्रॉस-ब्राउज़र संस्करण में कुछ खराब लीक होते हैं c2और संभावना होती है c1और c3इसलिए यह "use strict"ऊपर बताए अनुसार काम नहीं करेगा ।
कैम्पबेलन

41

यहाँ स्नाइपर के पोस्ट का एक कड़ा संस्करण है। यह अच्छी तरह से आधारभूत स्ट्रिंग का गठन करता है जिसमें कोई गाड़ी नहीं होती है। यह संस्करण दो छोरों को &0xffसमाप्त करता है, यारोस्लाव से फिक्स जोड़ता है , ट्रेलिंग नल को समाप्त करता है, साथ ही कोड गोल्फ का एक सा है।

decodeBase64 = function(s) {
    var e={},i,b=0,c,x,l=0,a,r='',w=String.fromCharCode,L=s.length;
    var A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    for(i=0;i<64;i++){e[A.charAt(i)]=i;}
    for(x=0;x<L;x++){
        c=e[s.charAt(x)];b=(b<<6)+c;l+=6;
        while(l>=8){((a=(b>>>(l-=8))&0xff)||(x<(L-2)))&&(r+=w(a));}
    }
    return r;
};

5
यहां तक ​​कि कम बाइट्स; डीdecodeBase64=function(f){var g={},b=65,d=0,a,c=0,h,e="",k=String.fromCharCode,l=f.length;for(a="";91>b;)a+=k(b++);a+=a.toLowerCase()+"0123456789+/";for(b=0;64>b;b++)g[a.charAt(b)]=b;for(a=0;a<l;a++)for(b=g[f.charAt(a)],d=(d<<6)+b,c+=6;8<=c;)((h=d>>>(c-=8)&255)||a<l-2)&&(e+=k(h));return e};
डेर होकस्टापलर

हाँ, लेकिन केवल ASCII के साथ काम करता है। Cyr अक्षर उदाहरण के लिए मिल जाते हैं।
मार्टिन कोवाचेव

@MartinKovachev क्या आप Cyr chars और संबंधित Base64 एन्कोडिंग के साथ उदाहरण पाठ के साथ एक नई टिप्पणी पोस्ट कर सकते हैं? शायद हम समायोजित करने के लिए कोड को ठीक कर सकते हैं।
Broc.seib

यहाँ: कुछ इस तरह: тестова фраза
मार्टिन

2
@ ऑलिवरसालबर्ग भी कम उत्पन्न कोड तालिका :):var g={},k=String.fromCharCode,i;for(i=0;i<64;)g[k(i>61?(i&1)*4|43:i+[65,71,-4][i/26&3])]=i++;
माइक

34

फेलसेफ के बिना छोटा और तेज़ बेस 64 जावास्क्रिप्ट डेकोड फंक्शन:

function decode_base64 (s)
{
    var e = {}, i, k, v = [], r = '', w = String.fromCharCode;
    var n = [[65, 91], [97, 123], [48, 58], [43, 44], [47, 48]];

    for (z in n)
    {
        for (i = n[z][0]; i < n[z][1]; i++)
        {
            v.push(w(i));
        }
    }
    for (i = 0; i < 64; i++)
    {
        e[v[i]] = i;
    }

    for (i = 0; i < s.length; i+=72)
    {
        var b = 0, c, x, l = 0, o = s.substring(i, i+72);
        for (x = 0; x < o.length; x++)
        {
            c = e[o.charAt(x)];
            b = (b << 6) + c;
            l += 6;
            while (l >= 8)
            {
                r += w((b >>> (l -= 8)) % 256);
            }
         }
    }
    return r;
}

6
ओपेरा 11.62 में '% 256' भाग के साथ समस्या है। इसे 'और 0xff' के साथ बदलने से यह काम करता है।
यारोस्लाव स्टावनिचि

Tyk वर्चुअल एंडपॉइंट जावास्क्रिप्ट कोड में '\ x00' भाग के साथ समस्या है। इसे r = r.replace (/ \ x00 / g, '') से
बदलकर

13

function b64_to_utf8( str ) {
  return decodeURIComponent(escape(window.atob( str )));
}

https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_.22Unicode_Problem.22


"एस्केप" को पदावनत किया गया है: ecma-international.org/ecma-262/9.0/…
डेविड ब्रौन

11

Php.js परियोजना PHP के कार्यों के कई के लिए जावास्क्रिप्ट कार्यान्वयन है। base64_encodeऔर base64_decodeशामिल हैं।


php.js सभी बुराई का अवतार है और नरक में इसकी अपनी परत के अंतर्गत आता है। प्लेग की तरह इससे बचें। (अधिक जानकारी: softwareengineering.stackexchange.com/questions/126671/… )
कोरस

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

8

क्या किसी ने कहा कि कोड गोल्फ? =)

समय के साथ पकड़ने के दौरान अपने बाधा को सुधारने का मेरा प्रयास निम्न है। अपनी सुविधा के लिए पूरक।

function decode_base64(s) {
  var b=l=0, r='',
  m='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  s.split('').forEach(function (v) {
    b=(b<<6)+m.indexOf(v); l+=6;
    if (l>=8) r+=String.fromCharCode((b>>>(l-=8))&0xff);
  });
  return r;
}

एक अतुल्यकालिक कार्यान्वयन के बाद मैं वास्तव में क्या था और मेरे आश्चर्य के लिए यह पता चला है forEachकि JQuery के $([]).eachविधि कार्यान्वयन के विपरीत बहुत अधिक तुल्यकालिक है।

यदि आपके पास भी ऐसी पागल धारणा है, तो 0 विलंब window.setTimeoutसे बेस 64 डिकोड को अतुल्यकालिक रूप से चलेगा और किए जाने पर परिणाम के साथ कॉलबैक फ़ंक्शन को निष्पादित करेगा।

function decode_base64_async(s, cb) {
  setTimeout(function () { cb(decode_base64(s)); }, 0);
}

@Toothbrush ने सुझाव दिया "एक सरणी की तरह एक स्ट्रिंग को अनुक्रमित करें", और छुटकारा पाएं split। यह दिनचर्या वास्तव में अजीब लगती है और यह सुनिश्चित नहीं होता है कि यह कितना संगत होगा, लेकिन यह एक और बर्डी को हिट करता है ताकि ऐसा हो सके।

function decode_base64(s) {
  var b=l=0, r='',
  m='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  [].forEach.call(s, function (v) {
    b=(b<<6)+m.indexOf(v); l+=6;
    if (l>=8) r+=String.fromCharCode((b>>>(l-=8))&0xff);
  });
  return r;
}

जावास्क्रिप्ट स्ट्रिंग पर अधिक जानकारी खोजने की कोशिश करते हुए, सरणी के रूप में मैं /./gएक स्ट्रिंग के माध्यम से कदम के लिए एक रेगेक्स का उपयोग करके इस प्रो टिप पर ठोकर खाई । यह स्ट्रिंग में जगह और रिटर्न वैरिएबल रखने की आवश्यकता को समाप्त करके कोड आकार को और भी कम कर देता है।

function decode_base64(s) {
  var b=l=0,
  m='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  return s.replace(/./g, function (v) {
    b=(b<<6)+m.indexOf(v); l+=6;
    return l<8?'':String.fromCharCode((b>>>(l-=8))&0xff);
  });
}

यदि आप कुछ और अधिक पारंपरिक के लिए देख रहे थे तो शायद निम्नलिखित आपके स्वाद के लिए अधिक है।

function decode_base64(s) {
  var b=l=0, r='', s=s.split(''), i,
  m='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  for (i in s) {
    b=(b<<6)+m.indexOf(s[i]); l+=6;
    if (l>=8) r+=String.fromCharCode((b>>>(l-=8))&0xff);
  }
  return r;
}

मेरे पास अनुगामी अशक्त समस्या नहीं थी, इसलिए इसे बराबर रहने के लिए हटा दिया गया था, लेकिन इसे आसानी से हल किया जाना चाहिए trim()या trimRight()यदि आप चाहें, तो यह आपके लिए एक समस्या बन सकती है।

अर्थात।

return r.trimRight();

ध्यान दें:

परिणाम एक एससीआई बाइट स्ट्रिंग है, अगर आपको यूनिकोड की आवश्यकता है तो सबसे आसान escapeबाइट स्ट्रिंग है जो तब decodeURIComponentयूनिकोड स्ट्रिंग का उत्पादन करने के लिए डिकोड किया जा सकता है ।

function decode_base64_usc(s) {      
  return decodeURIComponent(escape(decode_base64(s)));
}

चूंकि escapeपदावनत किया जा रहा है, हम बिना किसी आवश्यकता के सीधे यूनिकोड का समर्थन करने के लिए अपने फ़ंक्शन को बदल सकते हैं escapeया String.fromCharCodeहम %यूआरआई डिकोडिंग के लिए तैयार पलायन स्ट्रिंग का उत्पादन कर सकते हैं ।

function decode_base64(s) {
  var b=l=0,
  m='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  return decodeURIComponent(s.replace(/./g, function (v) {
    b=(b<<6)+m.indexOf(v); l+=6;
    return l<8?'':'%'+(0x100+((b>>>(l-=8))&0xff)).toString(16).slice(-2);
  }));
}

एन ज्वॉय!


3
आपको splitस्ट्रिंग की आवश्यकता नहीं है , क्योंकि आप एक सरणी की तरह एक जावास्क्रिप्ट स्ट्रिंग को अनुक्रमित कर सकते हैं। s.split('').forEach(function ...द्वारा प्रतिस्थापित किया जा सकता है [].forEach.call(s, function ...। यह बहुत तेजी से होना चाहिए, इसके कारण स्ट्रिंग को विभाजित नहीं करना है।
टूथब्रश

"अधिक पारंपरिक" एक मेरे लिए पूरी तरह से टूट गया था - पूरे मूल में छिड़के मूल पाठ के निशान के साथ एक गड़बड़ गड़बड़ का उत्पादन किया। क्रोम पर।
स्टीव बेनेट

@ सेनेट बेनेट मैंने क्रोम में सभी वेरिएंट का परीक्षण किया ... यह काम करता है। क्या आप एक उदाहरण base64 स्ट्रिंग प्रदान कर सकते हैं जो विफल रहता है?
निकल-

तीन साल बाद? हा। मुझे यह भी याद नहीं है कि मुझे इसके लिए क्या चाहिए था।
स्टीव बेनेट

6

मैंने phpjs.org पर जावास्क्रिप्ट रूटीन आज़माया है और उन्होंने अच्छा काम किया है।

मैंने पहली बार रणहिरू कोरे द्वारा चुने गए उत्तर में सुझाई गई दिनचर्या की कोशिश की - http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html

मैंने पाया कि उन्होंने सभी परिस्थितियों में काम नहीं किया। मैंने एक परीक्षण का मामला लिखा है जहाँ ये दिनचर्या विफल हो जाती है और उन्हें GitHub में पोस्ट किया जाता है:

https://github.com/scottcarter/base64_javascript_test_data.git

मैंने लेखक को सचेत करने के लिए ntt.cc पर ब्लॉग पोस्ट पर एक टिप्पणी पोस्ट की (मॉडरेशन की प्रतीक्षा में - लेख पुराना है इसलिए सुनिश्चित नहीं है कि टिप्पणी पोस्ट हो जाएगी)।


1

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


1

Node.js में हम इसे सरल तरीके से कर सकते हैं

var base64 = 'SGVsbG8gV29ybGQ='
var base64_decode = new Buffer(base64, 'base64').toString('ascii');

console.log(base64_decode); // "Hello World"

0

JavaScripts फ्रेमवर्क के लिए जहां कोई atobविधि नहीं है और यदि आप बाहरी पुस्तकालयों को आयात नहीं करना चाहते हैं, तो यह एक छोटा कार्य है जो इसे करता है।

यह एक स्ट्रिंग प्राप्त करेगा जिसमें Base64 एन्कोडेड मान होता है और बाइट्स का एक डीकोडेड ऐरे लौटाएगा (जहां बाइट्स की सरणी को संख्याओं के सरणी के रूप में दर्शाया जाता है जहां प्रत्येक संख्या 0 और 255 समावेशी के बीच पूर्णांक होती है)।

function fromBase64String(str) {
    var alpha = 
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var value = [];
    var index = 0;
    var destIndex  = 0;
    var padding = false;
    while (true) {

        var first  = getNextChr(str, index, padding, alpha);
        var second = getNextChr(str, first .nextIndex, first .padding, alpha);
        var third  = getNextChr(str, second.nextIndex, second.padding, alpha);
        var fourth = getNextChr(str, third .nextIndex, third .padding, alpha);

        index = fourth.nextIndex;
        padding = fourth.padding;

        // ffffffss sssstttt ttffffff
        var base64_first  = first.code  == null ? 0 : first.code;
        var base64_second = second.code == null ? 0 : second.code;
        var base64_third  = third.code  == null ? 0 : third.code;
        var base64_fourth = fourth.code == null ? 0 : fourth.code;

        var a = (( base64_first << 2) & 0xFC ) | ((base64_second>>4) & 0x03);
        var b = (( base64_second<< 4) & 0xF0 ) | ((base64_third >>2) & 0x0F);
        var c = (( base64_third << 6) & 0xC0 ) | ((base64_fourth>>0) & 0x3F);

        value [destIndex++] = a;
        if (!third.padding) {
            value [destIndex++] = b;
        } else {
            break;
        }
        if (!fourth.padding) {
            value [destIndex++] = c;
        } else {
            break;
        }
        if (index >= str.length) {
            break;
        }
    }
    return value;
}

function getNextChr(str, index, equalSignReceived, alpha) {
    var chr = null;
    var code = 0;
    var padding = equalSignReceived;
    while (index < str.length) {
        chr = str.charAt(index);
        if (chr == " " || chr == "\r" || chr == "\n" || chr == "\t") {
            index++;
            continue;
        }
        if (chr == "=") {
            padding = true;
        } else {
            if (equalSignReceived) {
                throw new Error("Invalid Base64 Endcoding character \"" 
                    + chr + "\" with code " + str.charCodeAt(index) 
                    + " on position " + index 
                    + " received afer an equal sign (=) padding "
                    + "character has already been received. "
                    + "The equal sign padding character is the only "
                    + "possible padding character at the end.");
            }
            code = alpha.indexOf(chr);
            if (code == -1) {
                throw new Error("Invalid Base64 Encoding character \"" 
                    + chr + "\" with code " + str.charCodeAt(index) 
                    + " on position " + index + ".");
            }
        }
        break;
    }
    return { character: chr, code: code, padding: padding, nextIndex: ++index};
}

उपयोग किए गए संसाधन: RFC-4648 धारा 4

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