Necesito una forma eficiente (lectura nativa) para convertir una ArrayBuffercadena 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
ArrayBufferes 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)},''))btoaes 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.reduceque 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).readAsDataURLpodría teóricamente devolver un porcentaje de dataURI codificado (y parece que en realidad es el caso en jsdom )splitmejor quesubstring?Usé esto y funciona para mí.
fuente
Mi recomendación para esto es NO usar
btoaestrategias 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
ArrayBufferque he intentado codificar se han codificado incorrectamente.Yo usaría la recomendación MDN o lo esencial.
fuente
btoano funciona en String, pero OP preguntaArrayBuffer.fuente
A continuación se presentan 2 funciones simples para convertir Uint8Array a String Base64 y viceversa
fuente
functionpalabra clave y debería funcionar en un navegador moderno.Puede derivar una matriz normal del
ArrayBuffermedianteArray.prototype.slice. Utilice una función comoArray.prototype.mapconvertir bytes en caracteres yjoinunirlos 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