Necesito una forma eficiente (lectura nativa) para convertir una ArrayBuffer
cadena base64 que debe usarse en una publicación de varias partes.
javascript
encoding
base64
arraybuffer
zaheer
fuente
fuente
join()
ponerlos al final es significativamente más rápido en Firefox, IE y Safari (pero mucho más lento en Chrome): jsperf.com/tobase64-implementationsFailed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
Esto funciona bien para mi:
En ES6, la sintaxis es un poco más simple:
Como se señaló en los comentarios, este método puede provocar un error de tiempo de ejecución en algunos navegadores cuando
ArrayBuffer
es grande. El límite de tamaño exacto depende de la implementación en cualquier caso.fuente
btoa([].reduce.call(new Uint8Array(bufferArray),function(p,c){return p+String.fromCharCode(c)},''))
btoa
es seguro para los caracteres en el rango de código 0-255, ya que este es el caso (piense en el 8Uint8Array
).Para aquellos a los que les gusta, este es otro
Array.reduce
que no causará desbordamiento de pila:fuente
<amount of Bytes in the buffer>
nuevas cadenas.btoa(new Uint8Array(arraybuffer).reduce((data,byte)=>(data.push(String.fromCharCode(byte)),data),[]).join(''))
?Hay otra forma asincrónica de usar Blob y FileReader.
No probé el rendimiento. Pero es una forma diferente de pensar.
fuente
dataurl.split(',', 2)[1]
lugar dedataurl.substr(dataurl.indexOf(',')+1)
.readAsDataURL
podría teóricamente devolver un porcentaje de dataURI codificado (y parece que en realidad es el caso en jsdom )split
mejor quesubstring
?Usé esto y funciona para mí.
fuente
Mi recomendación para esto es NO usar
btoa
estrategias nativas , ya que no codifican correctamente todasArrayBuffer
...reescribe los DOM atob () y btoa ()
Si bien nunca he encontrado este error exacto, he descubierto que muchos de los
ArrayBuffer
que he intentado codificar se han codificado incorrectamente.Yo usaría la recomendación MDN o lo esencial.
fuente
btoa
no funciona en String, pero OP preguntaArrayBuffer
.fuente
A continuación se presentan 2 funciones simples para convertir Uint8Array a String Base64 y viceversa
fuente
function
palabra clave y debería funcionar en un navegador moderno.Puede derivar una matriz normal del
ArrayBuffer
medianteArray.prototype.slice
. Utilice una función comoArray.prototype.map
convertir bytes en caracteres yjoin
unirlos en forma de cadena.Este método es más rápido ya que no hay concatenaciones de cadenas ejecutándose en él.
fuente
El OP no especificó el entorno de ejecución, pero si está utilizando Node.JS, hay una manera muy sencilla de hacerlo.
Acordar con los documentos oficiales de Node.JS https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
Además, si está ejecutando en Angular, por ejemplo, la clase de búfer también estará disponible en un entorno de navegador.
fuente
Javascript
. Así que actualicé mi respuesta para hacerlo más conciso. Creo que esta es una respuesta importante porque estaba buscando cómo hacer esto y no pude encontrar la mejor respuesta al problema.A mi lado, usando el navegador Chrome, tuve que usar DataView () para leer un arrayBuffer
fuente
Esto es mejor si usa JSZip para descomprimir el archivo de la cadena
fuente