Tengo un script PHP que puede codificar una imagen PNG en una cadena Base64.
Me gustaría hacer lo mismo usando JavaScript. Sé cómo abrir archivos, pero no estoy seguro de cómo hacer la codificación. No estoy acostumbrado a trabajar con datos binarios.
javascript
base64
nombre de usuario
fuente
fuente
Respuestas:
Puede usar
btoa()
yatob()
para convertir ay desde la codificación base64.Parece haber cierta confusión en los comentarios sobre lo que estas funciones aceptan / devuelven, así que ...
btoa()
acepta una "cadena" donde cada carácter representa un byte de 8 bits; si pasa una cadena que contiene caracteres que no se pueden representar en 8 bits, probablemente se romperá . Esto no es un problema si realmente está tratando la cadena como una matriz de bytes, pero si está tratando de hacer algo más, primero tendrá que codificarla.atob()
devuelve una "cadena" donde cada carácter representa un byte de 8 bits, es decir, su valor estará entre0
y0xff
. Esto no significa que sea ASCII: presumiblemente si está utilizando esta función, espera trabajar con datos binarios y no con texto.Ver también:
fuente
btoa(unescape(encodeURIComponent(str))))
si str es UFT8Desde aquí :
Además, la búsqueda en "codificación javascript base64" activa muchas otras opciones, la anterior fue la primera.
fuente
string = string.replace(/\r\n/g,"\n");
declaración cuestionable en el método de codificación utf8.string = string.replace(/\r\n/g,"\n");
en primer lugar, jajaja. Es como "oh, codifiquemos esta cadena, pero primero, ¿por qué no normalizamos aleatoriamente todos los saltos de línea sin ninguna razón?". Eso debería eliminarse absolutamente de la clase en todas las circunstancias.enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
. En mi navegador, esto funciona bien,NaN>>4
es igual a 0, pero no sé si todos los navegadores hacen esto (también,NaN/16
es igual a NaN).Internet Explorer 10+
Navegador cruzado
jsFiddle
con Node.js
Así es como codifica el texto normal a base64 en Node.js:
Y así es como decodifica cadenas codificadas en base64:
con Dojo.js
Para codificar una matriz de bytes usando dojox.encoding.base64:
Para decodificar una cadena codificada en base64:
bower instalar angular-base64
fuente
El código de Sunny es excelente, excepto que se rompe en IE7 debido a referencias a "esto". Solucionado reemplazando tales referencias con "Base64":
fuente
Puede usar
btoa
(a base-64) yatob
(desde base-64).Para IE 9 y versiones inferiores, pruebe el complemento jquery-base64 :
fuente
base64.encode(...)
ybase64.decode(...)
... adjuntarlo a jQuery cuando tenga cero funcionalidad específica de jQuery no tiene absolutamente ningún sentido ...De los comentarios (por SET y Stefan Steiger) debajo de la respuesta aceptada, aquí hay un resumen rápido de cómo codificar / decodificar una cadena a / desde base64 sin necesidad de una biblioteca.
Manifestación
(usa la biblioteca jQuery, pero no para codificar / decodificar)
Mostrar fragmento de código
fuente
Buffer.from(b64data, 'base64').toString();
Hay un par de errores en ambas implementaciones de
_utf8_decode
.c1
yc2
se asignan como variables globales debido al uso incorrecto de lavar
declaración, yc3
no se inicializa ni declara en absoluto.Funciona, pero estas variables sobrescribirán las existentes con el mismo nombre fuera de esta función.
Aquí hay una versión que no hará esto:
fuente
Hice +1 en la respuesta de Sunny, pero quería contribuir con algunos cambios que hice para mi propio proyecto en caso de que alguien lo encontrara útil. Básicamente, limpié un poco el código original para que JSLint no se queje tanto, e hice que los métodos marcados como privados en los comentarios fueran realmente privados. También agregué dos métodos que necesitaba en mi propio proyecto, a saber,
decodeToHex
yencodeFromHex
.El código:
fuente
Para los navegadores más nuevos, codifique Uint8Array en cadena y decodifique la cadena en Uint8Array.
Para Node.js puede usar lo siguiente para codificar string, Buffer o Uint8Array a string, y decodificar de string, Buffer o Uint8Array a Buffer.
fuente
Para hacer una URL de cadena codificada en Base64 amigable, en JavaScript podría hacer algo como esto:
Vea también este violín: http://jsfiddle.net/magikMaker/7bjaT/
fuente
encodeURIComponent
puede resultar en un resultado superior con menos gasto de esfuerzo por parte del desarrollador.Tenga en cuenta que esto no es adecuado para cadenas Unicode sin procesar. Vea la sección Unicode aquí .
Sintaxis para codificar
var encodedData = window.btoa(stringToEncode);
Sintaxis para decodificar
var decodedData = window.atob(encodedData);
fuente
He reescrito a mano, estos métodos de codificación y decodificación con la excepción del hexadecimal en un formato modular para compatibilidad multiplataforma / navegador y también con alcance privado real, y usos
btoa
yatob
si existen debido a la velocidad en lugar de utilizar su propia codificación:https://gist.github.com/Nijikokun/5192472
Uso:
fuente
Esta pregunta y sus respuestas me indicaron la dirección correcta.
Especialmente con unicode atob y btoa no se puede usar "vainilla" y en estos días TODO es unicode ..
Directamente desde Mozilla, dos buenas funciones para este propósito (probado con etiquetas Unicode y HTML dentro)
Estas funciones realizarán un rayo rápido en comparación con la decodificación de base64 sin formato utilizando una función de JavaScript personalizada ya que btoa y atob se ejecutan fuera del intérprete.
Si puede ignorar el viejo IE y los viejos teléfonos móviles (¿como el iPhone 3?), Esta debería ser una buena solución.
fuente
Si necesita codificar un objeto de imagen HTML, puede escribir funciones simples como:
Para obtener la base64 de la imagen por id:
mas aqui
fuente
Contribuyendo con un polyfill minificado para
window.atob
+window.btoa
que estoy usando actualmente.fuente
Prefiero usar los métodos de codificación / decodificación bas64 de CryptoJS , la biblioteca más popular para algoritmos criptográficos estándar y seguros implementados en JavaScript utilizando las mejores prácticas y patrones.
fuente
Aquí hay una versión de AngularJS Factory de la de @ user850789:
fuente
Necesitaba la codificación de una cadena UTF-8 como base64 para un proyecto mío. La mayoría de las respuestas aquí no parecen manejar adecuadamente los pares sustitutos de UTF-16 cuando se convierten a UTF-8, por lo que, para completar, publicaré mi solución:
Tenga en cuenta que el código no se prueba a fondo. Probé algunas entradas, incluidas cosas como
strToUTF8Base64('衠衢蠩蠨')
y comparé con la salida de una herramienta de codificación en línea ( https://www.base64encode.org/ ).fuente
Para mi proyecto todavía necesito soportar IE7 y trabajar con una gran entrada para codificar.
Basado en el código propuesto por Joe Dyndale y como se sugiere en el comentario de Marius, es posible mejorar el rendimiento con IE7 construyendo el resultado con una matriz en lugar de una cadena.
Aquí está el ejemplo para codificar:
fuente
Si bien un poco más de trabajo, si desea una solución nativa de alto rendimiento, hay algunas funciones HTML5 que puede usar.
Si puede obtener sus datos en un
Blob
, entonces puede usar la función FileReader.readAsDataURL () para obtener undata://
URL y cortar el frente para obtener los datos de base64.Sin embargo, es posible que deba realizar un procesamiento adicional para codificar los datos, ya que no estoy seguro de si los
+
caracteres se escapan o no para ladata://
URL, pero esto debería ser bastante trivial.fuente
Bueno, si está usando dojo, nos da una forma directa de codificar o decodificar en base64.
Prueba esto:-
Para codificar una matriz de bytes usando dojox.encoding.base64:
Para decodificar una cadena codificada en base64:
fuente
Puedes usar
window.btoa
ywindow.atob
...Probablemente, usar la forma en que MDN puede hacer su trabajo mejor ... También acepta unicode ... usando estas dos funciones simples:
fuente
Aquí hay una demostración en vivo de JS
atob()
ybtoa()
funciones incorporadas:fuente
Utilice la biblioteca js-base64 como
fuente