क्या जावास्क्रिप्ट में ऐसी कोई विधियाँ हैं जिनका उपयोग आधारभूत एन्कोडिंग का उपयोग करके एक स्ट्रिंग को एनकोड और डिकोड करने के लिए किया जा सकता है?
क्या जावास्क्रिप्ट में ऐसी कोई विधियाँ हैं जिनका उपयोग आधारभूत एन्कोडिंग का उपयोग करके एक स्ट्रिंग को एनकोड और डिकोड करने के लिए किया जा सकता है?
जवाबों:
कुछ ब्राउज़र जैसे फ़ायरफ़ॉक्स, क्रोम, सफारी, ओपेरा और IE10 + मूल रूप से Base64 को संभाल सकते हैं। इस Stackoverflow प्रश्न पर एक नज़र डालें । यह उपयोग कर रहा है btoa()
और atob()
कार्य करता है ।
सर्वर-साइड जावास्क्रिप्ट (नोड) के लिए, आप Buffer
s को डिकोड कर सकते हैं ।
यदि आप एक क्रॉस-ब्राउज़र समाधान के लिए जा रहे हैं, तो मौजूदा लाइब्ररी हैं जैसे क्रिप्टोजेएस या कोड:
http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html
उत्तरार्द्ध के साथ, आपको क्रॉस ब्राउज़र संगतता के लिए फ़ंक्शन का पूरी तरह से परीक्षण करने की आवश्यकता है। और त्रुटि की सूचना पहले ही दी जा चुकी है ।
new Buffer('Hello, world!').toString('base64');
new Buffer('SGVsbG8sIHdvcmxkIQ==', 'base64').toString('ascii');
(स्रोत)
new Buffer(string)
। Buffer.from(jwt.split('.')[1], 'base64').toString()
गेको / वेबिट-आधारित ब्राउज़रों (फ़ायरफ़ॉक्स, क्रोम और सफारी) और ओपेरा में, आप btoa () और atob () का उपयोग कर सकते हैं ।
मूल उत्तर: आप जावास्क्रिप्ट में Base64 को एक स्ट्रिंग कैसे एन्कोड कर सकते हैं?
// 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!"
यहाँ बताया गया है कि आप 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();
Dojox.encoding.base64 का उपयोग करके बाइट्स की एक सरणी को एनकोड करने के लिए:
var str = dojox.encoding.base64.encode(myByteArray);
एक बेस 64-एन्कोडेड स्ट्रिंग को डीकोड करने के लिए:
var bytes = dojox.encoding.base64.decode(str)
<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 एनकोडिंग
c2
और संभावना होती है c1
और c3
इसलिए यह "use strict"
ऊपर बताए अनुसार काम नहीं करेगा ।
यहाँ स्नाइपर के पोस्ट का एक कड़ा संस्करण है। यह अच्छी तरह से आधारभूत स्ट्रिंग का गठन करता है जिसमें कोई गाड़ी नहीं होती है। यह संस्करण दो छोरों को &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;
};
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};
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++;
फेलसेफ के बिना छोटा और तेज़ बेस 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;
}
function b64_to_utf8( str ) {
return decodeURIComponent(escape(window.atob( str )));
}
Php.js परियोजना PHP के कार्यों के कई के लिए जावास्क्रिप्ट कार्यान्वयन है। base64_encode
और base64_decode
शामिल हैं।
क्या किसी ने कहा कि कोड गोल्फ? =)
समय के साथ पकड़ने के दौरान अपने बाधा को सुधारने का मेरा प्रयास निम्न है। अपनी सुविधा के लिए पूरक।
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);
}));
}
एन ज्वॉय!
split
स्ट्रिंग की आवश्यकता नहीं है , क्योंकि आप एक सरणी की तरह एक जावास्क्रिप्ट स्ट्रिंग को अनुक्रमित कर सकते हैं। s.split('').forEach(function ...
द्वारा प्रतिस्थापित किया जा सकता है [].forEach.call(s, function ...
। यह बहुत तेजी से होना चाहिए, इसके कारण स्ट्रिंग को विभाजित नहीं करना है।
मैंने 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 पर ब्लॉग पोस्ट पर एक टिप्पणी पोस्ट की (मॉडरेशन की प्रतीक्षा में - लेख पुराना है इसलिए सुनिश्चित नहीं है कि टिप्पणी पोस्ट हो जाएगी)।
मैं बल्कि CryptoJS से bas64 एनकोड / डिकोड विधियों का उपयोग करूंगा , सर्वोत्तम प्रथाओं और पैटर्नों का उपयोग करके जावास्क्रिप्ट में कार्यान्वित मानक और सुरक्षित क्रिप्टोग्राफ़िक एल्गोरिदम के लिए सबसे लोकप्रिय पुस्तकालय।
Node.js में हम इसे सरल तरीके से कर सकते हैं
var base64 = 'SGVsbG8gV29ybGQ='
var base64_decode = new Buffer(base64, 'base64').toString('ascii');
console.log(base64_decode); // "Hello World"
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