Eu tenho um script PHP que pode codificar uma imagem PNG para uma seqüência de caracteres Base64.
Eu gostaria de fazer a mesma coisa usando JavaScript. Sei como abrir arquivos, mas não sei como fazer a codificação. Não estou acostumado a trabalhar com dados binários.
javascript
base64
nome do usuário
fonte
fonte
Respostas:
Você pode usar
btoa()
eatob()
converter para e da codificação base64.Parece haver alguma confusão nos comentários sobre o que essas funções aceitam / retornam, então…
btoa()
aceita uma "string" em que cada caractere representa um byte de 8 bits - se você passar uma string contendo caracteres que não podem ser representados em 8 bits, provavelmente será interrompida . Isso não é um problema se você estiver tratando a string como uma matriz de bytes, mas se estiver tentando fazer outra coisa, precisará codificá-la primeiro.atob()
retorna uma "string" onde cada caractere representa um byte de 8 bits - ou seja, seu valor estará entre0
e0xff
. Isso não significa que seja ASCII - presumivelmente, se você está usando essa função, espera trabalhar com dados binários e não com texto.Veja também:
fonte
btoa(unescape(encodeURIComponent(str))))
se str for UFT8A partir daqui :
Além disso, pesquise "codificação javascript base64" gera muitas outras opções, a acima foi a primeira.
fonte
string = string.replace(/\r\n/g,"\n");
declaração questionável no método de codificação utf8.string = string.replace(/\r\n/g,"\n");
em primeiro lugar, lol. É como "oh, vamos codificar essa string, mas primeiro, por que não normalizamos aleatoriamente todas as quebras de linha sem nenhuma boa razão?". Isso deve ser absolutamente removido da classe em todas as circunstâncias.enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
. No meu navegador, isso funciona ok,NaN>>4
é igual a 0, mas não sei se todos os navegadores fazem isso (tambémNaN/16
é igual a NaN).Internet Explorer 10 ou superior
Navegador Cruzado
jsFiddle
com Node.js
Aqui está como você codifica o texto normal para base64 no Node.js:
E aqui está como você decodifica cadeias codificadas em base64:
com Dojo.js
Para codificar uma matriz de bytes usando dojox.encoding.base64:
Para decodificar uma sequência codificada em base64:
bower install angular-base64
fonte
O código do Sunny é ótimo, exceto no IE7, devido a referências a "this". Corrigido substituindo essas referências por "Base64":
fonte
Você pode usar
btoa
(para a base 64) eatob
(da base 64).Para o IE 9 e abaixo, tente o plugin jquery-base64 :
fonte
base64.encode(...)
ebase64.decode(...)
... anexá-lo ao jQuery quando tiver zero a funcionalidade específica do jQuery não faz absolutamente nenhum sentido ...Dos comentários (de SET e Stefan Steiger) abaixo da resposta aceita, aqui está um rápido resumo de como codificar / decodificar uma string de / para base64 sem a necessidade de uma biblioteca.
Demo
(usa a biblioteca jQuery, mas não para codificação / decodificação)
Mostrar snippet de código
fonte
Buffer.from(b64data, 'base64').toString();
Existem alguns bugs nas duas implementações de
_utf8_decode
.c1
ec2
são atribuídos como variáveis globais devido ao uso incorreto davar
instrução, ec3
não são inicializados ou declarados.Funciona, mas essas variáveis substituem todas as existentes com o mesmo nome fora desta função.
Aqui está uma versão que não fará isso:
fonte
Marquei a resposta de Sunny com +1, mas queria contribuir com algumas mudanças que fiz para o meu próprio projeto, caso alguém ache útil. Basicamente, acabei de limpar um pouco o código original para que o JSLint não se queixe tanto, e tornei os métodos marcados como privados nos comentários realmente privados. Eu também adicionei dois métodos que eu precisava no meu próprio projeto, a saber
decodeToHex
eencodeFromHex
.O código:
fonte
Para navegadores mais recentes, codificar Uint8Array como string e decodificar string para Uint8Array.
Para Node.js, você pode usar o seguinte para codificar string, Buffer ou Uint8Array em string e decodificar de string, Buffer ou Uint8Array para Buffer.
fonte
Para tornar um URL de String codificado em Base64 amigável, em JavaScript, você pode fazer algo assim:
Veja também este Fiddle: http://jsfiddle.net/magikMaker/7bjaT/
fonte
encodeURIComponent
pode resultar em um resultado superior com menos gasto de esforço por parte do desenvolvedor.Observe que isso não é adequado para cadeias de caracteres Unicode brutas! Consulte a seção Unicode aqui .
Sintaxe para codificação
var encodedData = window.btoa(stringToEncode);
Sintaxe para decodificação
var decodedData = window.atob(encodedData);
fonte
Reescrevi manualmente, esses métodos de codificação e decodificação, com exceção do hexadecimal, em um formato modular para compatibilidade entre plataformas / navegadores e também com escopo privado real, além de utilizações
btoa
eatob
se existem devido à velocidade, em vez de utilizar sua própria codificação:https://gist.github.com/Nijikokun/5192472
Uso:
fonte
Esta pergunta e suas respostas me indicaram a direção certa.
Especialmente com unicode atob e btoa não pode ser usado "vanilla" e hoje em dia TUDO é unicode ..
Diretamente da Mozilla, duas boas funções para esse fim (testadas com tags unicode e html dentro)
Essas funções executarão extremamente rápido em comparação à decodificação bruta de base64 usando uma função javascript personalizada, pois btoa e atob são executados fora do intérprete.
Se você pode ignorar o IE antigo e os celulares antigos (como o iphone 3?), Essa deve ser uma boa solução.
fonte
se você precisar codificar o objeto de imagem HTML, poderá escrever funções simples como:
Para obter base64 da imagem por ID:
mais aqui
fonte
Contribuindo com um polyfill minificado para
window.atob
+window.btoa
que estou usando no momento.fonte
Prefiro usar os métodos de codificação / decodificação bas64 do CryptoJS , a biblioteca mais popular para algoritmos criptográficos padrão e seguros implementados em JavaScript usando as melhores práticas e padrões.
fonte
Aqui está uma versão do AngularJS Factory da @ user850789:
fonte
Eu precisava da codificação de uma string UTF-8 como base64 para um projeto meu. A maioria das respostas aqui não parece lidar adequadamente com pares substitutos UTF-16 ao converter para UTF-8; portanto, para fins de conclusão, publicarei minha solução:
Observe que o código não foi completamente testado. Testei algumas entradas, incluindo coisas como
strToUTF8Base64('衠衢蠩蠨')
e comparadas com a saída de uma ferramenta de codificação online ( https://www.base64encode.org/ ).fonte
Para o meu projeto, ainda preciso dar suporte ao IE7 e trabalhar com grandes entradas para codificação.
Com base no código proposto por Joe Dyndale e conforme sugerido no comentário de Marius, é possível melhorar o desempenho com o IE7 construindo o resultado com uma matriz em vez de uma string.
Aqui está o exemplo para codificar:
fonte
Enquanto um pouco mais de trabalho, se você deseja uma solução nativa de alto desempenho, existem algumas funções HTML5 que você pode usar.
Se você conseguir colocar seus dados em um
Blob
, poderá usar a função FileReader.readAsDataURL () para obter umdata://
URL e cortar a frente para obter os dados base64.No entanto, talvez seja necessário fazer mais processamento para codificar os dados, pois não tenho certeza se os
+
caracteres escaparam ou não dodata://
URL, mas isso deve ser bastante trivial.fonte
Bem, se você estiver usando dojo, isso nos dá uma maneira direta de codificar ou decodificar em base64.
Experimente o seguinte: -
Para codificar uma matriz de bytes usando dojox.encoding.base64:
Para decodificar uma sequência codificada em base64:
fonte
Você pode usar
window.btoa
ewindow.atob
...Provavelmente, usar a maneira como o MDN pode fazer seu trabalho da melhor maneira ... Aceitando também o Unicode ... usando estas duas funções simples:
fonte
Aqui está uma demonstração ao vivo de
atob()
ebtoa()
JS construídos em funções:fonte
Use a biblioteca js-base64 como
fonte