Saya membutuhkan cara (baca asli) yang efisien untuk mengonversi ArrayBuffer
string ke base64 yang perlu digunakan pada pos multi-bagian.
javascript
encoding
base64
arraybuffer
zaheer
sumber
sumber
join()
menambahkannya pada akhirnya secara signifikan lebih cepat pada Firefox, IE, dan Safari (tetapi lebih lambat pada Chrome): jsperf.com/tobase64-implementationsFailed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
Ini berfungsi baik untuk saya:
Dalam ES6, sintaks sedikit lebih sederhana:
Seperti yang ditunjukkan dalam komentar, metode ini dapat mengakibatkan kesalahan runtime di beberapa browser saat browser
ArrayBuffer
berukuran besar. Batas ukuran yang tepat tergantung pada implementasi dalam hal apa pun.sumber
btoa([].reduce.call(new Uint8Array(bufferArray),function(p,c){return p+String.fromCharCode(c)},''))
btoa
aman untuk karakter dalam rentang kode 0-255, karena ini masalahnya (Pikirkan tentang 8 inUint8Array
).Bagi mereka yang suka itu pendek, berikut ini menggunakan
Array.reduce
yang lain yang tidak akan menyebabkan stack overflow:sumber
<amount of Bytes in the buffer>
string baru.btoa(new Uint8Array(arraybuffer).reduce((data,byte)=>(data.push(String.fromCharCode(byte)),data),[]).join(''))
?Ada cara asinkron lain menggunakan Blob dan FileReader.
Saya tidak menguji kinerja. Tetapi cara berpikirnya berbeda.
sumber
dataurl.split(',', 2)[1]
sebagai gantidataurl.substr(dataurl.indexOf(',')+1)
.readAsDataURL
secara teoritis dapat mengembalikan persen data yang disandikanURI (Dan tampaknya itu sebenarnya kasus di jsdom )split
lebih baik daripadasubstring
?Saya menggunakan ini dan bekerja untuk saya.
sumber
Rekomendasi saya untuk ini adalah BUKAN menggunakan
btoa
strategi asli — karena mereka tidak benar menyandikan semuaArrayBuffer
...tulis ulang DOM atob () dan btoa ()
Meskipun saya belum pernah menemukan kesalahan yang tepat ini, saya telah menemukan bahwa banyak dari yang
ArrayBuffer
saya coba enkode telah disandikan secara salah.Saya akan menggunakan rekomendasi atau intisari MDN.
sumber
btoa
tidak berfungsi pada String, tetapi OP bertanyaArrayBuffer
.sumber
Di bawah ini adalah 2 fungsi sederhana untuk mengonversi Uint8Array ke Base64 String dan kembali lagi
sumber
function
kata kunci dan itu harus berfungsi di browser modern.Anda bisa mendapatkan array normal dari
ArrayBuffer
menggunakanArray.prototype.slice
. Gunakan fungsi sepertiArray.prototype.map
untuk mengkonversi byte ke karakter danjoin
mereka bersama-sama untuk membentuk string.Metode ini lebih cepat karena tidak ada rangkaian string yang berjalan di dalamnya.
sumber
OP tidak menentukan Running Enviroment tetapi jika Anda menggunakan Node.JS ada cara yang sangat sederhana untuk melakukan hal seperti itu.
Sesuai dengan dokumen Node.JS resmi https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
Juga, Jika Anda menjalankan di bawah Angular misalnya, Kelas Buffer juga akan tersedia di Lingkungan Browser.
sumber
Javascript
. Jadi saya memperbarui jawaban saya untuk membuatnya lebih ringkas. Saya pikir ini adalah jawaban yang penting karena saya mencari cara untuk melakukan ini dan tidak bisa mendapatkan jawaban terbaik untuk masalah ini.Di sebelah saya, menggunakan navigator Chrome, saya harus menggunakan DataView () untuk membaca arrayBuffer
sumber
Ini lebih baik, jika Anda menggunakan JSZip untuk membongkar arsip dari string
sumber