¿Por qué Javascript `atob ()` y `btoa ()` fueron nombrados así?

266

En Javascript, el window.atob()método decodifica una cadena base64 y el window.btoa()método codifica a stringen base64 .

Entonces, ¿por qué no fueron nombrados como base64Decode()y base64Encode()? atob()y btoa()no tiene sentido porque no son semánticos en absoluto.

Quiero saber el motivo.

Константин Ван
fuente
153
Me tomó años darme cuenta de que era "A a B". Los había estado pronunciando "a-tob" y "b-toa" todo ese tiempo.
Ryan
55
@ Ryan ¡Me alegro de que no haya sido solo yo!
TMH
1
Cuenta conmigo. Pensé lo mismo :-)
Super Coder
3
Saca tu ego de mi nomenclatura.
AJB
1
mal name, generalmente usan un nombre largo y claro como getElementById,addEventListener
cieunteung

Respuestas:

164

Los métodos atob()y btoa()permiten a los autores transformar el contenido hacia y desde la codificación base64.

En estas API, para fines mnemotécnicos, se puede considerar que "b" significa "binario" y "a" para "ASCII". Sin embargo, en la práctica, por razones principalmente históricas, tanto la entrada como la salida de estas funciones son cadenas Unicode.

De: http://www.w3.org/TR/html/webappapis.html#atob

Shershen
fuente
82
Pero es al revés. atob()convierte binario a ASCII y btoa()convierte ASCII a binario.
2540625
52
ascii es base64, y atobes ascii a binario. de alguna manera dejaron esto fuera de ambas respuestas. para que no se invierta
AKnox
13
Entonces, String¿ Binaryqué es ? Y pensé todo el tiempo, binario era algo así como 0 y 1. ¡Esto es TAN CONFUSOR!
Stefan Rein el
66
@StefanRein Estoy de acuerdo con tu opinión. window.btoalea su argumento como datos binarios y divídalo en 6 bits de fragmentos para codificarlo; es cierto, por lo que el nombre tiene sentido desde un punto de vista. Sin embargo, también, ¡ window.btoasolo toma una cadena como argumento! :(
Константин Ван
55
@ K._> "Sin embargo, también, ¡ window.btoasolo toma una cadena como argumento!" <Eso es cierto, pero la cadena aquí es solo una representación de los datos. Al igual que si intentas abrir una imagen en un bloc de notas, se mostrará como una cadena pero sigue siendo datos binarios. btoaLa principal ventaja es que no le importa en qué formato está la cadena, solo la trata como binaria. Es incidental que en la mayoría de los casos esa cadena sea una cadena normal.
laggingreflex
106

Para resumir las respuestas ya dadas:

  • atob representa ASCII to binary
    • p.ej: atob("ZXhhbXBsZSELCg==") == "example!^K"
  • btoa representa binary to ASCII
    • p.ej: btoa("\x01\x02\xfe\xff") == "AQL+/w=="

¿Por Un SCII y b ciertas piezas:

  • ASCII(the a) es el resultado de la base64codificación. Un texto seguro compuesto solo por un subconjunto de caracteres ascii (*) que se pueden representar y transportar correctamente (por ejemplo, el cuerpo del correo electrónico),
  • binary(the b) es cualquier flujo de 0s y 1s (en javascript debe representarse con un tipo de cadena).

(*) En base64estos se limitan a: A-Z, a-z, 0-9, +, /y =(relleno, sólo al final) https://en.wikipedia.org/wiki/Base64

PD: Debo admitir que yo mismo estaba inicialmente confundido por el nombre y pensé que los nombres se intercambiaron. Yo pensaba que bel soporte para " b ase64 cadena codificada" y ade " una cadena ny" : D.

derenio
fuente
77
Creo que básicamente probaste el punto de todos: base64 es un subconjunto de ASCII, por lo tanto, aunque podrías argumentar que la salida de btoatodavía es técnicamente ASCII, no hay justificación para el nombre atobque solo acepta base64 como entrada.
devios1
1
Ayuda a pensar y recordar 'a' (ascii) como salida base64 y 'b' (binario) como flujo de 0 y 1, que es una cadena.
Talespin_Kit
86

Sé que esto es viejo, pero recientemente apareció en Twitter, y pensé en compartirlo, ya que tiene autoridad.

Yo:

@BrendanEich, ¿elegiste esos nombres?

Él:

Nombres antiguos de Unix, páginas de manual difíciles de encontrar, pero vea https://www.unix.com/man-page/minix/1/btoa/… . Los nombres transferidos de Unix a la base de código Netscape. Los reflejé en JS con mucha prisa en 1995 (después de los diez días de mayo pero pronto).

En caso de que el enlace Minix se rompa, aquí está el contenido de la página del manual:

BTOA(1)                                           BTOA(1)

NAME
       btoa - binary to ascii conversion

SYNOPSIS
       btoa [-adhor] [infile] [outfile]

OPTIONS
       -a     Decode, rather than encode, the file

       -d     Extracts repair file from diagnosis file

       -h     Help menu is displayed giving the options

       -o     The obsolete algorithm is used for backward compatibility

       -r     Repair a damaged file

EXAMPLES
       btoa <a.out >a.btoa # Convert a.out to ASCII

       btoa -a <a.btoa >a.out
               # Reverse the above

DESCRIPTION
       Btoa  is  a  filter that converts a binary file to ascii for transmission over a telephone
       line.  If two file names are provided, the first in used for input and the second for out-
       put.   If  only one is provided, it is used as the input file.  The program is a function-
       ally similar alternative to uue/uud, but the encoding is completely different.  Since both
       of  these are widely used, both have been provided with MINIX.  The file is expanded about
       25 percent in the process.

SEE ALSO
       uue(1), uud(1).

Fuente: Brendan Eich, el creador de JavaScript. https://twitter.com/BrendanEich/status/998618208725684224

William Hilton
fuente
55
Bueno, esta es la respuesta real a la pregunta de OP.
Ivan Filho
6

No puedo encontrar una fuente en este momento, pero es de conocimiento común que en este caso, la b significa 'binario' y la a para 'ASCII'.

Por lo tanto, las funciones se denominan realmente:

ASCII a Binario para atob()y Binario a ASCII para btoa().

Tenga en cuenta que esta es la implementación del navegador, y se dejó con fines heredados / de compatibilidad con versiones anteriores. En Node.js, por ejemplo, estos no existen.

Egoísta
fuente
En Node usas Buffer.from("Hello World").toString('base64')&Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii')
Nanoo