J'ai besoin d'un moyen efficace (en lecture native) pour convertir un ArrayBuffer
en une chaîne base64 qui doit être utilisée sur un article en plusieurs parties.
javascript
encoding
base64
arraybuffer
zaheer
la source
la source
join()
leur ing à la fin est beaucoup plus rapide sur Firefox, IE et Safari (mais beaucoup plus lent sur Chrome): jsperf.com/tobase64-implementationsFailed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
Cela fonctionne bien pour moi:
Dans ES6, la syntaxe est un peu plus simple:
Comme indiqué dans les commentaires, cette méthode peut entraîner une erreur d'exécution dans certains navigateurs lorsqu'elle
ArrayBuffer
est volumineuse. La taille exacte dépend de l'implémentation dans tous les cas.la source
btoa([].reduce.call(new Uint8Array(bufferArray),function(p,c){return p+String.fromCharCode(c)},''))
btoa
est sans danger pour les caractères dans la plage de code 0-255, comme c'est le cas ici (pensez au 8 poucesUint8Array
).Pour ceux qui l'aiment court, voici une autre utilisation
Array.reduce
qui ne causera pas de débordement de pile:la source
<amount of Bytes in the buffer>
nouvelles chaînes.btoa(new Uint8Array(arraybuffer).reduce((data,byte)=>(data.push(String.fromCharCode(byte)),data),[]).join(''))
?Il existe une autre manière asynchrone d'utiliser Blob et FileReader.
Je n'ai pas testé la performance. Mais c'est une façon de penser différente.
la source
dataurl.split(',', 2)[1]
au lieu dedataurl.substr(dataurl.indexOf(',')+1)
.readAsDataURL
pourrait théoriquement renvoyer un pourcentage codé dataURI (et il semble que ce soit effectivement le cas dans jsdom )split
mieux quesubstring
?J'ai utilisé cela et travaille pour moi.
la source
Ma recommandation est de ne PAS utiliser de
btoa
stratégies natives, car elles ne codent pas correctement toutesArrayBuffer
…réécrire les DOM atob () et btoa ()
Bien que je n'aie jamais rencontré cette erreur exacte, j'ai constaté que la plupart des codes que
ArrayBuffer
j'ai essayé de coder ne sont pas codés correctement.J'utiliserais soit la recommandation MDN ou l'essentiel.
la source
btoa
ne fonctionne pas sur String, mais OP demandeArrayBuffer
.la source
Voici 2 fonctions simples pour convertir Uint8Array en chaîne Base64 et vice-versa
la source
function
mot - clé et cela devrait fonctionner dans un navigateur moderne.Vous pouvez dériver un tableau normal de à l'
ArrayBuffer
aide deArray.prototype.slice
. Utilisez une fonction telle queArray.prototype.map
convertir les octets en caractères etjoin
les convertir ensemble en une chaîne.Cette méthode est plus rapide car il n'y a aucune concaténation de chaînes en cours d'exécution.
la source
L'OP n'a pas spécifié l'environnement d'exécution, mais si vous utilisez Node.JS, il existe un moyen très simple de le faire.
Accord avec les documents officiels Node.JS https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
De plus, si vous utilisez sous Angular par exemple, la classe de tampon sera également disponible dans un environnement de navigateur.
la source
Javascript
. J'ai donc mis à jour ma réponse pour la rendre plus concise. Je pense que c'est une réponse importante parce que je cherchais comment faire et je n'ai pas pu trouver la meilleure réponse au problème.À mes côtés, en utilisant le navigateur Chrome, j'ai dû utiliser DataView () pour lire un arrayBuffer
la source
C'est mieux si vous utilisez JSZip pour décompresser l'archive de la chaîne
la source