Eu preciso converter uma string de codificação base64 em um ArrayBuffer. As strings de base64 são entradas do usuário, elas serão copiadas e coladas de um e-mail, portanto, não estarão lá quando a página for carregada. Eu gostaria de fazer isso em javascript sem fazer uma chamada ajax para o servidor, se possível.
Achei esses links interessantes, mas eles não me ajudaram:
ArrayBuffer para string codificada em base64
trata-se da conversão oposta, de ArrayBuffer para base64, não o contrário
http://jsperf.com/json-vs-base64/2
parece bom, mas não consigo descobrir como usar o código.
Existe uma maneira fácil (talvez nativa) de fazer a conversão? obrigado
javascript
base64
arraybuffer
Tony
fonte
fonte
bytes[i] = binary_string.charCodeAt(i);
pode estar erradoUsando TypedArray.from :
Desempenho a ser comparado com a versão for loop da resposta de Goran.it.
fonte
Uint8Array.from
ainda tem pouca compatibilidade com alguns navegadores.ExecJS::RuntimeError: SyntaxError: Unexpected token: operator (>)
; (trilhos 5).buffer
propriedade do que é retornado deUint8Array
atob
oubtoa
, você apenas precisa fornecer uma entrada válida.atob
precisa de uma string base64 válida, caso contrário, ele gerará um erro. Ebtoa
precisa de uma string de byte válida (também chamada de string binária), que é uma string contendo caracteres no intervalo 0-255. Se sua string tiver caracteres fora desse intervalo,btoa
ocorrerá um erro.A resposta de Goran.it não funciona devido a um problema de unicode em javascript - https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding .
Acabei usando a função fornecida no blog de Daniel Guerrero: http://blog.danguer.com/2011/10/24/base64-binary-decoding-in-javascript/
A função está listada no link do github: https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js
Use estas linhas
fonte
atob
todos.decodeArrayBuffer
retorna umArrayBuffer
que tem tamanho sempre divisível por 3, que não entendo se é por design ou um bug. Vou perguntar no projeto github.Acabei de encontrar base64-arraybuffer, um pequeno pacote npm com uso incrivelmente alto, 5 milhões de downloads no mês passado (2017-08).
https://www.npmjs.com/package/base64-arraybuffer
Para quem procura a melhor solução padrão, pode ser esta.
fonte
Solução assíncrona , é melhor quando os dados são grandes:
fonte
Javascript é um bom ambiente de desenvolvimento, então parece estranho que ele não forneça uma solução para este pequeno problema. As soluções oferecidas em outras partes desta página são potencialmente lentas. Aqui está minha solução. Ele emprega a funcionalidade embutida que decodifica urls de dados de imagem e som em base64.
A solicitação de envio falha se a string de base 65 estiver mal formada.
O tipo MIME (aplicativo / octeto) é provavelmente desnecessário.
Testado em cromo. Deve funcionar em outros navegadores.
fonte
Access Denied
erro, que parece ser uma limitação do CORS.Para usuários Node.js:
myBuffer será do tipo Buffer, que é uma subclasse de Uint8Array. Infelizmente, Uint8Array NÃO é um ArrayBuffer como o OP estava pedindo. Mas ao manipular um ArrayBuffer, quase sempre envolvo-o com Uint8Array ou algo semelhante, então deve estar próximo do que está sendo solicitado.
fonte
JS puro - sem meio-passo de string (sem atob)
Escrevo a seguinte função que converte base64 de maneira direta (sem conversão para string no meio do caminho). IDÉIA
=
caracteres, remova um / dois números da matriz de saídaA solução abaixo permite processar grandes strings de entrada de base64. Função semelhante para converter bytes em base64 sem btoa está AQUI
Exibir trecho de código
fonte
fonte