Necesito convertir una cadena de codificación base64 en un ArrayBuffer. Las cadenas base64 son entradas del usuario, se copiarán y pegarán desde un correo electrónico, por lo que no estarán allí cuando se cargue la página. Me gustaría hacer esto en javascript sin hacer una llamada ajax al servidor si es posible.
Encontré esos enlaces interesantes, pero no me ayudaron:
ArrayBuffer a cadena codificada en base64
se trata de la conversión opuesta, de ArrayBuffer a base64, no al revés
http://jsperf.com/json-vs-base64/2
esto se ve bien pero no puedo entender cómo usar el código.
¿Existe una forma fácil (tal vez nativa) de realizar la conversión? Gracias
bytes[i] = binary_string.charCodeAt(i);
pueden ser incorrectosUsando TypedArray. De :
El rendimiento se comparará con la versión de bucle for de la respuesta de Goran.it.
fuente
Uint8Array.from
todavía tiene poca compatibilidad con algunos navegadores.ExecJS::RuntimeError: SyntaxError: Unexpected token: operator (>)
; (carriles 5).buffer
propiedad de lo que se devuelveUint8Array
atob
obtoa
, solo tienes que darles una entrada válida.atob
necesita una cadena base64 válida, de lo contrario arrojará un error. Ybtoa
necesita una cadena de bytes válida (también llamada cadena binaria) que es una cadena que contiene caracteres en el rango 0-255. Si su cadena tiene caracteres fuera de ese rango,btoa
arrojará un error.La respuesta de Goran.it no funciona debido a un problema de Unicode en javascript: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding .
Terminé usando la función dada en el blog de Daniel Guerrero: http://blog.danguer.com/2011/10/24/base64-binary-decoding-in-javascript/
La función se enumera en el enlace de github: https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js
Use estas líneas
fuente
atob
en absoluto.decodeArrayBuffer
devuelve unArrayBuffer
tamaño que siempre es divisible por 3, que no entiendo si es por diseño o por error. Preguntaré en el proyecto github.Acabo de encontrar base64-arraybuffer, un pequeño paquete npm con un uso increíblemente alto, 5 millones de descargas el mes pasado (2017-08).
https://www.npmjs.com/package/base64-arraybuffer
Para cualquiera que busque la mejor solución estándar, esta puede ser la solución.
fuente
Solución asincrónica , es mejor cuando los datos son grandes:
fuente
Javascript es un buen entorno de desarrollo, por lo que parece extraño que no proporcione una solución a este pequeño problema. Las soluciones que se ofrecen en otras partes de esta página son potencialmente lentas. Aquí está mi solución. Emplea la funcionalidad incorporada que decodifica las URL de datos de imagen y sonido base64.
La solicitud de envío falla si la cadena base 65 está mal formada.
El tipo mime (aplicación / octeto) probablemente sea innecesario.
Probado en cromo. Debería funcionar en otros navegadores.
fuente
Access Denied
error, que parece ser una limitación de CORS.Para los usuarios de Node.js:
myBuffer será de tipo Buffer, que es una subclase de Uint8Array. Desafortunadamente, Uint8Array NO es un ArrayBuffer como pedía el OP. Pero cuando manipulo un ArrayBuffer, casi siempre lo envuelvo con Uint8Array o algo similar, por lo que debería estar cerca de lo que se solicita.
fuente
Pure JS - sin cadena middlestep (sin atob)
Escribo la siguiente función que convierte base64 de manera directa (sin conversión a cadena en el paso medio). IDEA
=
, elimine uno / dos números de la matriz de salidaLa siguiente solución permite procesar grandes cadenas de entrada base64. Una función similar para convertir bytes a base64 sin btoa está AQUÍ
Mostrar fragmento de código
fuente
fuente