जवाबों:
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
join()
अंत में उन्हें फ़ायरफ़ॉक्स, IE, और सफारी पर काफी तेज है (लेकिन क्रोम पर काफी धीमा): jsperf.com/tobase64-implementations
यह मेरे लिए ठीक काम करता है:
var base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)));
ES6 में, वाक्य-विन्यास थोड़ा सरल है:
let base64String = btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
जैसा कि टिप्पणियों में बताया गया है, यह विधि ArrayBuffer
बड़े होने पर कुछ ब्राउज़रों में एक रनटाइम त्रुटि हो सकती है। सटीक आकार सीमा किसी भी मामले में कार्यान्वयन पर निर्भर है।
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(''))
?
एक और अतुल्यकालिक तरीका है Blob और FileReader का उपयोग करें।
मैंने प्रदर्शन का परीक्षण नहीं किया। लेकिन यह सोचने का एक अलग तरीका है।
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
सैद्धांतिक रूप से एक प्रतिशत एन्कोडेड डेटारी वापस कर सकता है (और ऐसा लगता है कि यह वास्तव में jsdom में मामला है )
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 () को फिर से लिखें
चूंकि DOMStrings 16-बिट-एन्कोडेड स्ट्रिंग्स हैं, इसलिए ज्यादातर यूनिकोड स्ट्रिंग पर window.btoa कॉल करने वाले ब्राउज़र में कैरेक्टर आउट ऑफ रेंज अपवाद होगा यदि कोई कैरेक्टर 8-बिट ASCII-एन्कोडेड कैरेक्टर की सीमा से अधिक है।
जबकि मुझे इस सटीक त्रुटि का कभी सामना नहीं करना पड़ा है, मैंने पाया है कि ArrayBuffer
मैंने जिन लोगों को एनकोड करने की कोशिश की है उनमें से कई ने गलत तरीके से एनकोड किया है।
मैं या तो एमडीएन सिफारिश या जिस्ट का उपयोग करूंगा।
btoa
स्ट्रिंग पर काम नहीं करता है, लेकिन ओपी पूछ रहा है ArrayBuffer
।
var blob = new Blob([arrayBuffer])
var reader = new FileReader();
reader.onload = function(event){
var base64 = event.target.result
};
reader.readAsDataURL(blob);
नीचे U648Array को Base64 स्ट्रिंग में बदलने और फिर से वापस करने के लिए 2 सरल कार्य दिए गए हैं
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
}
यह विधि तेज़ है क्योंकि इसमें कोई स्ट्रिंग कॉन्फेंशन नहीं चल रहे हैं।
ओपी ने रनिंग एनवायरमेंट को निर्दिष्ट नहीं किया, लेकिन यदि आप नोड का उपयोग कर रहे हैं। तो ऐसा काम करने के लिए एक बहुत ही सरल तरीका है।
आधिकारिक Node.JS डॉक्स 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("");
}
यह बेहतर है, अगर आप स्ट्रिंग से अनपैक आर्काइव के लिए JSZip का उपयोग करते हैं