জাভাস্ক্রিপ্টে এমন কোন পদ্ধতি আছে যা বেস 64 এবং এনকোডিং ব্যবহার করে একটি স্ট্রিং এনকোড এবং ডিকোড করতে ব্যবহার করা যেতে পারে?
জাভাস্ক্রিপ্টে এমন কোন পদ্ধতি আছে যা বেস 64 এবং এনকোডিং ব্যবহার করে একটি স্ট্রিং এনকোড এবং ডিকোড করতে ব্যবহার করা যেতে পারে?
উত্তর:
ফায়ারফক্স, ক্রোম, সাফারি, অপেরা এবং আই 10 10 এর মতো কিছু ব্রাউজার বেস 64 কে স্থানীয়ভাবে পরিচালনা করতে পারে। এই স্ট্যাকওভারফ্লো প্রশ্নটি একবার দেখুন । এটি ব্যবহার btoa()
এবং atob()
ফাংশন ।
সার্ভার-সাইড জাভাস্ক্রিপ্ট (নোড) এর জন্য, আপনি Buffer
ডিকোড করতে এস ব্যবহার করতে পারেন ।
আপনি যদি ক্রস-ব্রাউজার সমাধানের জন্য যাচ্ছেন তবে ক্রিপ্টোজেএস বা কোড এর মতো বিদ্যমান লাইব্রেরি রয়েছে :
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()
গেকো / ওয়েবকিট-ভিত্তিক ব্রাউজারগুলিতে (ফায়ারফক্স, ক্রোম এবং সাফারি) এবং অপেরাতে আপনি বিটিওএ () এবং অটোব () ব্যবহার করতে পারেন ।
আসল উত্তর: আপনি কীভাবে জাভাস্ক্রিপ্টে বেস 64 তে একটি স্ট্রিং এনকোড করতে পারেন?
// 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 তে বেস টেক্সটটি বেস 64 এ কীভাবে এনকোড করবেন:
//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"
উপরের হিসাবে সংজ্ঞায়িত।
এখানে স্নিপার পোস্টের একটি শক্ত সংস্করণ দেওয়া আছে। এটি কোনও গাড়িবহর রিটার্ন ছাড়াই ভালভাবে গঠিত বেস 64 স্ট্রিং ধরে রেখেছে। এই সংস্করণটি কয়েকটা লুপ &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 প্রকল্পের পিএইচপি এর ফাংশন অনেক জাভাস্ক্রিপ্ট বাস্তবায়নের হয়েছে। 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
জিকুয়েরির $([]).each
পদ্ধতির প্রয়োগের বিপরীতে পরিণত হয়েছিল খুব সংক্রামক।
আপনার যদি এইরকম ক্রেজি ধারণাও মনে থাকে তবে 0 দেরি window.setTimeout
বেস 64 dec ode ode ode ode ode ode ode ode yn yn yn yn yn the the yn yn result result result
function decode_base64_async(s, cb) {
setTimeout(function () { cb(decode_base64(s)); }, 0);
}
@ টুথব্রাশ "অ্যারের মতো একটি স্ট্রিং সূচীকরণ" করার পরামর্শ দিয়েছিলেন এবং এর থেকে মুক্তি পান 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);
});
}
তবে আপনি যদি খানিকটা traditionalতিহ্যবাহী কিছু খুঁজছিলেন তবে নিম্নলিখিতটি আপনার স্বাদে আরও বেশি।
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);
}));
}
nJoy!
split
স্ট্রিংয়ের দরকার নেই , যেহেতু আপনি একটি অ্যারের মতো জাভাস্ক্রিপ্ট স্ট্রিংটি সূচক করতে পারেন। s.split('').forEach(function ...
দ্বারা প্রতিস্থাপন করা যেতে পারে [].forEach.call(s, function ...
। এটি স্ট্রিংকে বিভক্ত না করার কারণে এটি আরও দ্রুত হওয়া উচিত।
আমি phpjs.org এ জাভাস্ক্রিপ্টের রুটিনগুলি চেষ্টা করেছি এবং তারা ভাল কাজ করেছে।
আমি প্রথম রানহিরু কুরাই দ্বারা নির্বাচিত উত্তরে প্রস্তাবিত রুটিনগুলি চেষ্টা করেছিলাম - http://ntt.cc/2008/01/19/base64-encoder-decoder-with- জাভাস্ক্রিপ্ট html
আমি খুঁজে পেয়েছি যে তারা সব পরিস্থিতিতে কাজ করে না। আমি একটি পরীক্ষার কেস লিখেছিলাম যেখানে এই রুটিনগুলি ব্যর্থ হয় এবং এগুলিকে এখানে গিটহাবে পোস্ট করে:
https://github.com/scottcarter/base64_javascript_test_data.git
লেখককে সতর্ক করার জন্য আমি এনটিটিসি তে ব্লগ পোস্টে একটি মন্তব্যও পোস্ট করেছি (সংযমের অপেক্ষায় - নিবন্ধটি পুরানো তাই মন্তব্যটি পোস্ট হবে কিনা তা নিশ্চিত নয়)।
আমি বরং ক্রিপ্টোজেএস থেকে বেস 64 এনকোড / ডিকোড পদ্ধতিগুলি ব্যবহার করেছি, সেরা অনুশীলন এবং নিদর্শন ব্যবহার করে জাভাস্ক্রিপ্টে প্রয়োগ করা স্ট্যান্ডার্ড এবং সুরক্ষিত ক্রিপ্টোগ্রাফিক অ্যালগরিদমগুলির জন্য সর্বাধিক জনপ্রিয় লাইব্রেরি।
নোড.জেজে আমরা এটি সহজ উপায়ে করতে পারি
var base64 = 'SGVsbG8gV29ybGQ='
var base64_decode = new Buffer(base64, 'base64').toString('ascii');
console.log(base64_decode); // "Hello World"
জাভা স্ক্রিপ্টস ফ্রেমওয়ার্কের জন্য যেখানে নেই atob
পদ্ধতি নেই এবং আপনি যদি বাহ্যিক লাইব্রেরিগুলি আমদানি করতে না চান তবে এটি সংক্ষিপ্ত ফাংশন যা এটি করে।
এটিতে একটি স্ট্রিং আসবে যা বেস64 64 এনকোডড মান সহ এবং বাইটগুলির একটি ডিকোডেড অ্যারে ফিরিয়ে দেবে (যেখানে বাইটের অ্যারে সংখ্যার অ্যারে হিসাবে প্রতিনিধিত্ব করা হয় যেখানে প্রতিটি সংখ্যা 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};
}
সংস্থানসমূহ ব্যবহৃত: আরএফসি -44548 ধারা 4