উত্তর:
function _arrayBufferToBase64( buffer ) {
var binary = '';
var bytes = new Uint8Array( buffer );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
return window.btoa( binary );
}
তবে, অ-নেটিভ বাস্তবায়ন দ্রুত হয় যেমন https://gist.github.com/958841 দেখুন http://jsperf.com/encoding-xhr-image-data/6
Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
এটি আমার পক্ষে ভাল কাজ করে:
var base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)));
ES6-তে বাক্যবিন্যাসটি কিছুটা সহজ:
let base64String = btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
মন্তব্যে নির্দেশিত হিসাবে, এই পদ্ধতিটি ArrayBuffer
বড় হয়ে গেলে কিছু ব্রাউজারে একটি রানটাইম ত্রুটির কারণ হতে পারে । সঠিক আকার সীমা যে কোনও ক্ষেত্রে বাস্তবায়ন নির্ভর করে is
btoa([].reduce.call(new Uint8Array(bufferArray),function(p,c){return p+String.fromCharCode(c)},''))
btoa
0-255 কোডের পরিসরের অক্ষরের জন্য নিরাপদ, কারণ এখানে এটি রয়েছে (8 টি সম্পর্কে চিন্তা করুন Uint8Array
)।
যাঁরা এটি সংক্ষিপ্ত পছন্দ করেন তাদের জন্য, এখানে এমন আরও একটি ব্যবহার রয়েছে Array.reduce
যা স্ট্যাকের উপচে পড়বে না:
var base64 = btoa(
new Uint8Array(arrayBuffer)
.reduce((data, byte) => data + String.fromCharCode(byte), '')
);
<amount of Bytes in the buffer>
নতুন স্ট্রিং তৈরি করছেন ।
btoa(new Uint8Array(arraybuffer).reduce((data,byte)=>(data.push(String.fromCharCode(byte)),data),[]).join(''))
?
ব্লব এবং ফাইলরেডার ব্যবহার করার মতো আরও একটি অ্যাসিনক্রোনাস উপায় রয়েছে।
আমি পারফরম্যান্স পরীক্ষা করিনি। তবে এটি ভাবনার আলাদা উপায়।
function arrayBufferToBase64( buffer, callback ) {
var blob = new Blob([buffer],{type:'application/octet-binary'});
var reader = new FileReader();
reader.onload = function(evt){
var dataurl = evt.target.result;
callback(dataurl.substr(dataurl.indexOf(',')+1));
};
reader.readAsDataURL(blob);
}
//example:
var buf = new Uint8Array([11,22,33]);
arrayBufferToBase64(buf, console.log.bind(console)); //"CxYh"
dataurl.split(',', 2)[1]
পরিবর্তে ব্যবহার করুন dataurl.substr(dataurl.indexOf(',')+1)
।
readAsDataURL
তাত্ত্বিকভাবে একটি শতাংশ এনকোডেড ডেটা ইউআরআই ফেরত দিতে পারে (এবং এটি সম্ভবত জাসডমের ক্ষেত্রেই দেখা যায় )
split
চেয়ে ভাল হবে কেন substring
?
আমি এটি ব্যবহার করেছি এবং আমার জন্য কাজ করে।
function arrayBufferToBase64( buffer ) {
var binary = '';
var bytes = new Uint8Array( buffer );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
return window.btoa( binary );
}
function base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array( len );
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
এর জন্য আমার প্রস্তাবনাটি হ'ল দেশীয় btoa
কৌশলগুলি ব্যবহার না করা - কারণ তারা সমস্তগুলি সঠিকভাবে এনকোড করে না ArrayBuffer
...
DOMs atob () এবং btoa () পুনরায় লিখুন
যেহেতু ডিওএমএসআরটিংগুলি 16-বিট-এনকোডেড স্ট্রিং রয়েছে তাই বেশিরভাগ ব্রাউজারে উইন্ডো.বিটো কল করে একটি ইউনিকোড স্ট্রিংয়ে একটি অক্ষর 8-বিট ASCII- এনকোডেড অক্ষরের সীমা ছাড়িয়ে গেলে রেঞ্জ ব্যতিক্রমের কারণ হয়ে উঠতে পারে।
যদিও আমি কখনও এই সঠিক ত্রুটির মুখোমুখি হইনি, আমি দেখতে পেয়েছি যে ArrayBuffer
আমি এনকোড করার চেষ্টা করেছি এমন বেশিরভাগই ভুলভাবে এনকোড করেছে।
আমি হয় MDN সুপারিশ বা সংক্ষেপ ব্যবহার করব would
btoa
স্ট্রিংয়ে কাজ করে না, তবে ওপি জিজ্ঞাসা করছে ArrayBuffer
।
var blob = new Blob([arrayBuffer])
var reader = new FileReader();
reader.onload = function(event){
var base64 = event.target.result
};
reader.readAsDataURL(blob);
Uint8Array কে বেস 64 স্ট্রিংয়ে রূপান্তর করার জন্য নীচে দুটি সাধারণ ফাংশন রয়েছে এবং আবার ফিরে
arrayToBase64String(a) {
return btoa(String.fromCharCode(...a));
}
base64StringToArray(s) {
let asciiString = atob(s);
return new Uint8Array([...asciiString].map(char => char.charCodeAt(0)));
}
function
কীওয়ার্ডটি যুক্ত করুন এবং এটি একটি আধুনিক ব্রাউজারে কাজ করা উচিত।
আপনি ArrayBuffer
ব্যবহার করে একটি সাধারণ অ্যারে সংগ্রহ করতে পারেন Array.prototype.slice
। Array.prototype.map
বাইটসকে অক্ষরগুলিতে রূপান্তর করতে এবং join
তাদের একসাথে ফর্মার স্ট্রিংয়ে রূপান্তর করতে একটি ফাংশন ব্যবহার করুন ।
function arrayBufferToBase64(ab){
var dView = new Uint8Array(ab); //Get a byte view
var arr = Array.prototype.slice.call(dView); //Create a normal array
var arr1 = arr.map(function(item){
return String.fromCharCode(item); //Convert
});
return window.btoa(arr1.join('')); //Form a string
}
এতে কোনও স্ট্রিং কনটেন্টেশন চলছে না বলে এই পদ্ধতিটি দ্রুত faster
ওপিতে রানিং এনভায়ারোমেন্ট নির্দিষ্ট করা হয়নি তবে আপনি যদি নোড.জেএস ব্যবহার করেন তবে এ জাতীয় কাজ করার খুব সহজ উপায় আছে।
অফিসিয়াল নোড.জেএস ডক্স https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings এর সাথে অ্যাকর্ডিগ
// This step is only necessary if you don't already have a Buffer Object
const buffer = Buffer.from(yourArrayBuffer);
const base64String = buffer.toString('base64');
এছাড়াও, আপনি উদাহরণস্বরূপ কৌনিক অধীনে চলতে থাকলে, বাফার ক্লাসটি ব্রাউজার পরিবেশেও উপলব্ধ করা হবে।
Javascript
। তাই আমি আমার উত্তরটি আরও সংক্ষিপ্ত করে তুলতে আপডেট করেছি। আমি মনে করি এটি একটি গুরুত্বপূর্ণ উত্তর কারণ আমি কীভাবে এটি করব তা অনুসন্ধান করেছিলাম এবং সমস্যার সর্বোত্তম উত্তর পেতে পারি না।
আমার পাশে, ক্রোম নেভিগেটর ব্যবহার করে, একটি অ্যারেবফার পড়তে আমাকে ডেটাভিউ () ব্যবহার করতে হয়েছিল
function _arrayBufferToBase64( tabU8A ) {
var binary = '';
let lecteur_de_donnees = new DataView(tabU8A);
var len = lecteur_de_donnees.byteLength;
var chaine = '';
var pos1;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( lecteur_de_donnees.getUint8( i ) );
}
chaine = window.btoa( binary )
return chaine;}
function _arrayBufferToBase64(uarr) {
var strings = [], chunksize = 0xffff;
var len = uarr.length;
for (var i = 0; i * chunksize < len; i++){
strings.push(String.fromCharCode.apply(null, uarr.subarray(i * chunksize, (i + 1) * chunksize)));
}
return strings.join("");
}
এটি স্ট্রিং থেকে সংরক্ষণাগারটি আনপ্যাক করার জন্য জেএসজিপ ব্যবহার করা ভাল