Preciso de uma maneira eficiente (leia-se nativa) para converter uma ArrayBuffer
string em base64, que precisa ser usada em uma postagem com várias partes.
javascript
encoding
base64
arraybuffer
zaheer
fonte
fonte
join()
ing-los no final é significativamente mais rápido no Firefox, IE e Safari (mas bastante mais lento no Chrome): jsperf.com/tobase64-implementationsFailed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
Este trabalho é bom para mim:
No ES6, a sintaxe é um pouco mais simples:
Conforme indicado nos comentários, esse método pode resultar em um erro de tempo de execução em alguns navegadores quando o
ArrayBuffer
tamanho é grande. O limite exato de tamanho depende da implementação em qualquer caso.fonte
btoa([].reduce.call(new Uint8Array(bufferArray),function(p,c){return p+String.fromCharCode(c)},''))
btoa
é seguro para caracteres no intervalo de código de 0 a 255, pois esse é o caso (pense nos 8 polUint8Array
.).Para quem gosta de curtir, aqui está outro
Array.reduce
que não causará estouro de pilha:fonte
<amount of Bytes in the buffer>
novas strings.btoa(new Uint8Array(arraybuffer).reduce((data,byte)=>(data.push(String.fromCharCode(byte)),data),[]).join(''))
?Há outra maneira assíncrona de usar Blob e FileReader.
Eu não testei o desempenho. Mas é uma maneira diferente de pensar.
fonte
dataurl.split(',', 2)[1]
vez dedataurl.substr(dataurl.indexOf(',')+1)
.readAsDataURL
teoricamente poderia retornar um por cento codificado dataURI (E parece que é realmente o caso em jsdom )split
seria melhor do quesubstring
?Eu usei isso e funciona para mim.
fonte
Minha recomendação para isso é NÃO usar
btoa
estratégias nativas , pois elas não codificam corretamente todasArrayBuffer
as…reescreva os DOMs atob () e btoa ()
Embora nunca tenha encontrado esse erro exato, descobri que muitos dos
ArrayBuffer
que tentei codificar foram codificados incorretamente.Eu usaria recomendação MDN ou essência.
fonte
btoa
não funciona em String, mas o OP está perguntandoArrayBuffer
.fonte
Abaixo estão 2 funções simples para converter Uint8Array em Base64 String e vice-versa
fonte
function
palavra-chave e ela deverá funcionar em um navegador moderno.Você pode derivar uma matriz normal do
ArrayBuffer
usandoArray.prototype.slice
. Use uma função comoArray.prototype.map
converter bytes em caracteres ejoin
eles juntos para formar uma string.Esse método é mais rápido, pois não há concatenações de strings em execução.
fonte
O OP não especificou o ambiente em execução, mas se você estiver usando o Node.JS, há uma maneira muito simples de fazer isso.
De acordo com os documentos oficiais do Node.JS https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
Além disso, se você estiver executando em Angular, por exemplo, a Classe Buffer também será disponibilizada em um Ambiente de Navegador.
fonte
Javascript
. Atualizei minha resposta para torná-la mais concisa. Acho que essa é uma resposta importante, porque estava pesquisando como fazer isso e não consegui encontrar a melhor resposta para o problema.Ao meu lado, usando o navegador Chrome, tive que usar o DataView () para ler um arrayBuffer
fonte
Isso é melhor, se você usar JSZip para descompactar archive da string
fonte