ทำไม Javascript `atob () 'และ` btoa () `ตั้งชื่ออย่างนั้น?


266

ใน Javascript, window.atob()วิธีการถอดรหัสbase64สตริงและwindow.btoa()วิธีการเข้ารหัสstringเข้าbase64

แล้วทำไมเขาไม่ได้พวกเขาตั้งชื่อเหมือนbase64Decode()และbase64Encode()? atob()และbtoa()ไม่เข้าท่าเพราะมันไม่มีความหมายเลย

ฉันต้องการทราบเหตุผล


153
เอาปีให้ฉันรู้ว่ามันคือ "A to B" ฉันออกเสียง "a-tob" และ "b-toa" ตลอดเวลา
Ryan

5
@ Ryan ฉันดีใจที่ไม่ใช่แค่ฉัน!
TMH

1
นับฉันด้วยฉันคิดเหมือนกัน :-)
Super Coder

3
เอาอัตตาของคุณออกจากระบบการตั้งชื่อของฉัน
AJB

1
ที่ไม่ดีname, พวกเขามักจะใช้ชื่อยาวที่ชัดเจนเช่นgetElementById,addEventListener
cieunteung

คำตอบ:


164

กระบวนการatob()และbtoa()วิธีการอนุญาตให้ผู้เขียนแปลงเนื้อหาเป็นและจากการเข้ารหัส base64

ใน APIs เหล่านี้สำหรับวัตถุประสงค์ช่วยในการจำคำว่า "b" สามารถพิจารณาได้ว่าเป็น "binary" และ "a" สำหรับ "ASCII" ในทางปฏิบัติแม้ว่าสำหรับเหตุผลทางประวัติศาสตร์เป็นหลักทั้งอินพุตและเอาต์พุตของฟังก์ชันเหล่านี้คือสตริง Unicode

จาก: http://www.w3.org/TR/html/webappapis.html#atob


82
แต่มันย้อนกลับ atob()แปลงไบนารีเป็น ASCII และbtoa()แปลง ASCII เป็นไบนารี
2540625

52
ascii เป็น base64 และatobเป็น ascii เป็น binary พวกเขาออกจากคำตอบทั้งคู่นี้ ดังนั้นจึงไม่มีการย้อนกลับ
AKnox

13
ดังนั้นStringคือBinaryอะไร! และฉันคิดอยู่ตลอดเวลาว่าไบนารี่คืออะไรเช่น 0 และ 1 นี่คือความสับสน!
Stefan Rein

6
@StefanRein ฉันเห็นด้วยกับความคิดเห็นของคุณ window.btoaอ่านอาร์กิวเมนต์เป็นข้อมูลไบนารีและแบ่งออกเป็น 6 บิตของชิ้นส่วนเพื่อเข้ารหัส มันเป็นเรื่องจริงดังนั้นการตั้งชื่อจึงสมเหตุสมผลในมุมมอง อย่างไรก็ตามยังwindow.btoaใช้สตริงเป็นอาร์กิวเมนต์เท่านั้น! :(
КонстантинВан

5
@ K._> "อย่างไรก็ตามwindow.btoaใช้สตริงเป็นอาร์กิวเมนต์เท่านั้น!" <จริง แต่สตริงที่นี่เป็นเพียงการแสดงข้อมูล เช่นถ้าคุณพยายามเปิดภาพในแผ่นจดบันทึกมันจะแสดงเป็นสตริง แต่ยังคงเป็นข้อมูลไบนารี btoaข้อได้เปรียบหลักของมันคือมันไม่สนใจว่ารูปแบบของสตริงจะอยู่ในรูปแบบใด ในกรณีส่วนใหญ่สตริงนั้นจะเป็นสตริงปกติ
laggingreflex

106

เพื่อสรุปคำตอบที่ได้รับ:

  • atob หมายถึง ASCII to binary
    • เช่น: atob("ZXhhbXBsZSELCg==") == "example!^K"
  • btoa หมายถึง binary to ASCII
    • เช่น: btoa("\x01\x02\xfe\xff") == "AQL+/w=="

ทำไมA SCII และb inary:

  • ASCII(the a) เป็นผลลัพธ์ของการbase64เข้ารหัส ปลอดภัยข้อความประกอบด้วยเฉพาะของส่วนย่อยของตัวอักษร ASCII (*) ที่สามารถแสดงได้อย่างถูกต้องและการขนส่ง (ร่างกายเช่นอีเมล)
  • binary( b) เป็นสตรีมใด ๆ ของ0sและ1s (ใน javascript จะต้องแสดงด้วยประเภทสตริง)

(*) ในbase64เหล่านี้จะถูก จำกัด ให้: A-Z, a-z, 0-9, +, /และ=(padding เท่านั้นที่สิ้นสุด) https://en.wikipedia.org/wiki/Base64

ป.ล. ฉันต้องยอมรับว่าตัวฉันเองเริ่มสับสนกับการตั้งชื่อและคิดว่าชื่อถูกเปลี่ยน ผมคิดว่าbขาตั้งสำหรับ" ase64 สตริงเข้ารหัส"และaสำหรับ" สตริง ny" : D


7
ฉันคิดว่าคุณเพียงแค่พิสูจน์จุดของทุกคนแล้ว: base64 เป็นเซตย่อยของ ASCII ดังนั้นในขณะที่คุณอาจโต้แย้งว่าผลลัพธ์ของbtoaเทคนิค ASCII ยังคงไม่มีผลลัพธ์สำหรับชื่อatobที่ยอมรับ base64 เป็นอินพุตเท่านั้น
devios1

1
ช่วยในการคิดและจดจำ 'a' (ascii) เป็นเอาต์พุต base64 และ 'b' (ไบนารี) เป็นสตรีมของ 0 และ 1 ซึ่งเป็นสตริง
Talespin_Kit

86

ฉันรู้ว่านี่เก่า แต่เพิ่งมาใน Twitter และฉันคิดว่าฉันจะแบ่งปันเพราะมีสิทธิ์

ผม:

@Brendan คุณเลือกชื่อเหล่านั้นเหรอ?

พระองค์

ชื่อ Unix เก่ายากที่จะหาหน้าคน rn แต่ดู https://www.unix.com/man-page/minix/1/btoa/ …. ชื่อที่นำมาจาก Unix ลงในฐานข้อมูล Netscape ฉันสะท้อนพวกเขาเข้าสู่ JS อย่างรวดเร็วในปี 1995 (หลังจากสิบวันในเดือนพฤษภาคม แต่ไม่นาน)

ในกรณีที่การเชื่อมโยง Minix แตกนี่เป็นเนื้อหาของ man page:

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

ที่มา: Brendan Eich ผู้สร้าง JavaScript https://twitter.com/BrendanEich/status/998618208725684224


5
นี่คือคำตอบที่แท้จริงสำหรับคำถามของ OP
Ivan Filho

6

ฉันไม่สามารถหาแหล่งที่มาในขณะนี้ แต่มันเป็นความรู้ทั่วไปที่ในกรณีนี้ b หมายถึง 'ไบนารี' และ a สำหรับ 'ASCII'

ดังนั้นฟังก์ชั่นจึงตั้งชื่อจริง:

ASCII เป็นไบนารีสำหรับatob()และไบนารีเพื่อ ASCII btoa()สำหรับ

โปรดทราบว่านี่คือการนำเบราว์เซอร์มาใช้และถูกทิ้งไว้เพื่อวัตถุประสงค์ด้านความเข้ากันได้แบบดั้งเดิม / แบบย้อนหลัง ใน Node.js ตัวอย่างเหล่านี้ไม่มีอยู่


ในโหนดคุณใช้Buffer.from("Hello World").toString('base64')&Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii')
Nanoo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.