J'ai besoin de convertir une chaîne d'encodage base64 en un ArrayBuffer. Les chaînes base64 sont entrées par l'utilisateur, elles seront copiées et collées à partir d'un e-mail, donc elles ne sont pas là lorsque la page est chargée. Je voudrais faire cela en javascript sans faire un appel ajax au serveur si possible.
J'ai trouvé ces liens intéressants, mais ils ne m'ont pas aidé:
ArrayBuffer en chaîne encodée en base64
il s'agit de la conversion opposée, de ArrayBuffer à base64, et non l'inverse
http://jsperf.com/json-vs-base64/2
cela semble bon mais je ne peux pas comprendre comment utiliser le code.
Existe-t-il un moyen simple (peut-être natif) de faire la conversion? Merci
bytes[i] = binary_string.charCodeAt(i);
peuvent être erronésUtilisation de TypedArray.from :
Performances à comparer avec la version en boucle for de la réponse Goran.it.
la source
Uint8Array.from
y a encore peu de compatibilité avec certains navigateurs.ExecJS::RuntimeError: SyntaxError: Unexpected token: operator (>)
; (rails 5).buffer
propriété de ce qui est renvoyé deUint8Array
atob
oubtoa
, il suffit de leur donner une entrée valide.atob
a besoin d'une chaîne base64 valide, sinon cela générera une erreur. Et abtoa
besoin d'une chaîne d'octets valide (également appelée chaîne binaire) qui est une chaîne contenant des caractères compris entre 0 et 255. Si votre chaîne contient des caractères en dehors de cette plage,btoa
une erreur sera générée.La réponse de Goran.it ne fonctionne pas en raison d'un problème Unicode en javascript - https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding .
J'ai fini par utiliser la fonction donnée sur le blog de Daniel Guerrero: http://blog.danguer.com/2011/10/24/base64-binary-decoding-in-javascript/
La fonction est répertoriée sur le lien github: https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js
Utilisez ces lignes
la source
atob
du tout.decodeArrayBuffer
renvoie unArrayBuffer
dont la taille est toujours divisible par 3, ce que je ne comprends pas si c'est par conception ou par un bug. Je vais demander dans le projet github.Je viens de trouver base64-arraybuffer, un petit package npm avec une utilisation incroyablement élevée, 5 millions de téléchargements le mois dernier (2017-08).
https://www.npmjs.com/package/base64-arraybuffer
Pour ceux qui recherchent quelque chose d'une meilleure solution standard, c'est peut-être cela.
la source
Solution asynchrone , c'est mieux lorsque les données sont volumineuses:
la source
Javascript est un bon environnement de développement, il semble donc étrange qu'il ne fournit pas de solution à ce petit problème. Les solutions proposées ailleurs sur cette page sont potentiellement lentes. Voici ma solution. Il utilise la fonctionnalité intégrée qui décode les URL de données d'image et de son en base64.
La demande d'envoi échoue si la chaîne de base 65 est mal formée.
Le type mime (application / octet) est probablement inutile.
Testé en chrome. Devrait fonctionner dans d'autres navigateurs.
la source
Access Denied
erreur, qui semble être une limitation CORS.Pour les utilisateurs de Node.js:
myBuffer sera de type Buffer qui est une sous-classe de Uint8Array. Malheureusement, Uint8Array n'est PAS un ArrayBuffer comme l'OP le demandait. Mais lors de la manipulation d'un ArrayBuffer, je l'enveloppe presque toujours avec Uint8Array ou quelque chose de similaire, donc il devrait être proche de ce qui est demandé.
la source
Pure JS - pas de chaîne intermédiaire (pas d'atob)
J'écris la fonction suivante qui convertit la base64 de manière directe (sans conversion en chaîne au pas moyen). IDÉE
=
, supprimez un / deux nombres du tableau de sortieLa solution ci-dessous permet de traiter de grandes chaînes d'entrée base64. Une fonction similaire pour convertir des octets en base64 sans btoa est ICI
Afficher l'extrait de code
la source
la source