Warum wurden Javascript "atob ()" und "btoa ()" so benannt?

265

In Javascript window.atob()decodiert die Methode eine base64- Zeichenfolge und die window.btoa()Methode eine stringin base64 .

Warum wurden sie dann nicht so genannt base64Decode()und base64Encode()? atob()und btoa()machen keinen Sinn, weil sie überhaupt nicht semantisch sind.

Ich möchte den Grund wissen.

Константин Ван
quelle
153
Ich habe Jahre gebraucht, um zu erkennen, dass es "A bis B" war. Ich hatte sie die ganze Zeit "a-tob" und "b-toa" ausgesprochen.
Ryan
5
@ Ryan Ich bin froh, dass es nicht nur ich war!
TMH
1
Zählen Sie mich mit. Ich dachte das gleiche :-)
Super Coder
3
Holen Sie sich Ihr Ego aus meiner Nomenklatur.
AJB
1
schlecht name, normalerweise verwenden sie klare lange Namen wie getElementById,addEventListener
cieunteung

Antworten:

164

Mit den Methoden atob()und btoa()können Autoren Inhalte in und aus der base64-Codierung transformieren.

In diesen APIs kann für mnemonische Zwecke das "b" als "binär" und das "a" als "ASCII" angesehen werden. In der Praxis sind jedoch hauptsächlich aus historischen Gründen sowohl die Eingabe als auch die Ausgabe dieser Funktionen Unicode-Zeichenfolgen.

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

shershen
quelle
82
Aber es ist rückwärts. atob()konvertiert Binär in ASCII und btoa()konvertiert ASCII in Binär.
2540625
52
ascii ist base64 und atobist ascii zu binär. Sie haben dies aus beiden Antworten herausgelassen. so ist es nicht umgekehrt
AKnox
13
Also das Stringist Binary?! Und ich dachte die ganze Zeit, Binär ist so etwas wie 0 und 1. Das ist so verwirrend!
Stefan Rein
6
@StefanRein Ich stimme deiner Meinung zu. window.btoaLesen Sie das Argument als Binärdaten und teilen Sie es in 6 Bits auf, um es zu codieren. es ist wahr, also macht die Benennung aus einer Sicht Sinn. Nimmt aber auch window.btoanur einen String als Argument! :(
Константин Ван
5
@ K._> "Nimmt aber auch window.btoanur einen String als Argument!" <Das stimmt, aber die Zeichenfolge hier ist nur eine Darstellung der Daten. Wenn Sie beispielsweise versuchen, ein Bild in einem Notizblock zu öffnen, wird es als Zeichenfolge angezeigt, es handelt sich jedoch weiterhin um Binärdaten. btoaDer Hauptvorteil ist, dass es egal ist, in welchem ​​Format die Zeichenfolge vorliegt, sondern dass sie nur als binär behandelt wird. Es ist nur zufällig, dass diese Zeichenfolge in den meisten Fällen eine reguläre Zeichenfolge ist.
Laggingreflex
106

Um die bereits gegebenen Antworten zusammenzufassen:

  • atob steht für ASCII to binary
    • z.B: atob("ZXhhbXBsZSELCg==") == "example!^K"
  • btoa steht für binary to ASCII
    • z.B: btoa("\x01\x02\xfe\xff") == "AQL+/w=="

Warum A SCII und B inary:

  • ASCII(the a) ist das Ergebnis der base64Codierung. Ein sicherer Text, der nur aus einer Teilmenge von ASCII-Zeichen (*) besteht, die korrekt dargestellt und transportiert werden können (z. B. E-Mail-Text).
  • binary(the b) ist ein beliebiger Stream von 0s und 1s (in Javascript muss er mit einem String-Typ dargestellt werden).

(*) In base64diese beschränkt zu sein : A-Z, a-z, 0-9, +, /und =(padding, erst am Ende) https://en.wikipedia.org/wiki/Base64

PS Ich muss zugeben, dass ich selbst anfangs durch die Benennung verwirrt war und dachte, die Namen wurden getauscht. Ich dachte, das bsteht für " b ase64 coded string" und afür " a ny string" : D.

ihrio
quelle
7
Ich denke, Sie haben im Grunde nur den Standpunkt aller bewiesen: base64 ist eine Teilmenge von ASCII. Obwohl Sie vielleicht argumentieren, dass die Ausgabe von btoatechnisch immer noch ASCII ist, gibt es keine Rechtfertigung für den Namen, atobder nur base64 als Eingabe akzeptiert.
Devios1
1
Es hilft, 'a' (ascii) als base64-Ausgabe und 'b' (binär) als Strom von 0 und 1, der Zeichenfolge, zu denken und sich daran zu erinnern.
Talespin_Kit
86

Ich weiß, dass dies alt ist, aber es ist kürzlich auf Twitter aufgetaucht, und ich dachte, ich würde es teilen, da es maßgeblich ist.

Mich:

@BrendanEich hast du diese Namen ausgewählt?

Ihm:

Alte Unix-Namen, schwer zu findende Manpages, aber siehe https://www.unix.com/man-page/minix/1/btoa/… . Die von Unix in die Netscape-Codebasis übertragenen Namen. Ich habe sie 1995 in großer Eile in JS reflektiert (nach den zehn Tagen im Mai, aber bald).

Falls der Minix-Link unterbrochen wird, finden Sie hier den Inhalt der Manpage:

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).

Quelle: Brendan Eich, der Schöpfer von JavaScript. https://twitter.com/BrendanEich/status/998618208725684224

William Hilton
quelle
5
Nun, dies ist die eigentliche Antwort auf die Frage von OP.
Ivan Filho
6

Ich kann momentan keine Quelle finden, aber es ist allgemein bekannt, dass in diesem Fall das b für 'binär' und das a für 'ASCII' steht.

Daher heißen die Funktionen tatsächlich:

ASCII zu Binär für atob()und Binär zu ASCII für btoa().

Beachten Sie, dass dies eine Browser-Implementierung ist und aus Gründen der Legacy- / Abwärtskompatibilität beibehalten wurde. In Node.js zum Beispiel existieren diese nicht.

Egoistisch
quelle
In Node benutzt du Buffer.from("Hello World").toString('base64')&Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii')
Nanoo