วิธีใช้งาน
- พิมพ์หรือวางข้อความที่ต้องการเข้ารหัส ตั้ง “รูปแบบอินพุต” เป็น “เลขฐานสิบหก” เพื่อเข้ารหัสไบต์ดิบ หรือคลิก “เปิดไฟล์” เพื่อเข้ารหัสไฟล์
- ตั้ง “การเข้ารหัสอักขระ” เป็น UTF-8 ไว้ เว้นแต่ระบบปลายทางต้องการชุดอักขระอื่น
- ตั้งค่าตัวเลือก: ใช้ “รูปแบบ” มาตรฐานสำหรับงานส่วนใหญ่ ปิด “แพดดิง” หากฝั่งผู้รับไม่ต้องการ และตั้ง “ตัดบรรทัด” ที่ 76 (MIME) หรือ 64 (PEM) อักขระเมื่อจำเป็น
- กด “คัดลอก” เพื่อคัดลอกเอาต์พุต Base64 หรือ “ดาวน์โหลด” เพื่อบันทึกเป็นไฟล์
การเข้ารหัส Base64 ทำงานอย่างไร
ตัวเข้ารหัสจะอ่านอินพุตครั้งละสามไบต์ ข้อมูล 24 บิตนี้จะถูกแบ่งเป็นสี่กลุ่ม กลุ่มละ 6 บิต และค่า 6 บิตแต่ละค่า (0 ถึง 63) จะใช้เลือกอักขระหนึ่งตัว ได้แก่ A-Z สำหรับ 0 ถึง 25 a-z สำหรับ 26 ถึง 51 0-9 สำหรับ 52 ถึง 61 ตามด้วย + และ / อินพุตสามไบต์ให้เอาต์พุตสี่อักขระ Base64 จึงมีขนาดใหญ่กว่าข้อมูลต้นฉบับประมาณ 33%
Text M a n
Bytes 77 97 110
Bits 01001101 01100001 01101110
6-bit 010011 010110 000101 101110
Index 19 22 5 46
Base64 T W F u
แพดดิงและความยาวของเอาต์พุต
เมื่อความยาวของอินพุตไม่ใช่พหุคูณของสาม กลุ่มสุดท้ายจะไม่ครบ ไบต์ที่เหลือหนึ่งไบต์จะกลายเป็นอักขระสองตัวตามด้วย == ส่วนไบต์ที่เหลือสองไบต์จะกลายเป็นอักขระสามตัวและ = หนึ่งตัว ดังนั้นเมื่ออินพุตมี n ไบต์ เอาต์พุตที่มีแพดดิงจะยาว 4 × ceil(n / 3) อักขระเสมอ
แพดดิงไม่ได้บรรจุข้อมูลใด ๆ JSON Web Token พารามิเตอร์ใน URL และ API จำนวนมากจึงละแพดดิงไว้ ให้ปิดแพดดิงเมื่อฝั่งผู้รับต้องการเอาต์พุตที่ไม่มีแพดดิง สำหรับลิงก์และชื่อไฟล์ ให้เลือกรูปแบบปลอดภัยสำหรับ URL หรือใช้หน้า Base64URL ซึ่งจะแทนที่ + และ / ด้วย - และ _
การตัดบรรทัดสำหรับ MIME และ PEM
โดยค่าเริ่มต้น เอาต์พุตจะเป็นบรรทัดยาวบรรทัดเดียว ซึ่งเป็นรูปแบบที่ JSON, data URI และส่วนหัว HTTP ต้องการ แต่มีสองรูปแบบที่ต้องมีการขึ้นบรรทัดใหม่:
- MIME 76 อักขระ ไฟล์แนบอีเมลที่ส่งด้วย
Content-Transfer-Encoding: base64ต้องมีบรรทัดยาวไม่เกิน 76 อักขระ (RFC 2045) ตัวเลือกนี้จะจบบรรทัดด้วย CRLF ตามที่ MIME กำหนด - PEM 64 อักขระ ใบรับรองและคีย์ที่อยู่ระหว่างบรรทัด
-----BEGINและ-----ENDใช้บรรทัดละ 64 อักขระ (RFC 7468) ตัวเลือกนี้จบบรรทัดด้วย LF
ชุดอักขระและไฟล์
Base64 เข้ารหัสไบต์ ไม่ใช่ตัวอักษร ข้อความจึงต้องถูกแปลงเป็นไบต์ด้วยชุดอักขระก่อน ตัวอักษร é มีขนาดสองไบต์ใน UTF-8 แต่มีเพียงหนึ่งไบต์ใน ISO-8859-1 หรือ Windows-1252 ข้อความเดียวกันจึงให้ผลลัพธ์ Base64 ต่างกัน UTF-8 เป็นตัวเลือกที่ถูกต้องสำหรับเว็บ JSON และ API สมัยใหม่เกือบทั้งหมด ให้เลือก GBK, Shift_JIS, Windows-1251 หรือชุดอักขระอื่นเฉพาะเมื่อต้องให้ตรงกับระบบรุ่นเก่าเท่านั้น
ไฟล์จะถูกเข้ารหัสตรงตามที่จัดเก็บไว้ โดยไม่มีการแปลงชุดอักขระ สำหรับรูปภาพพร้อมโค้ด HTML และ CSS สำเร็จรูป ดู แปลงรูปภาพเป็น Base64 หากต้องการ data URI พร้อมชนิด MIME ที่ตรวจพบ ให้ใช้ แปลงไฟล์เป็น Base64
ข้อกำหนด
| ชุดตัวอักษร | A-Z a-z 0-9 + / |
|---|---|
| ขนาดเอาต์พุต | 4 อักขระต่อ 3 ไบต์ (ประมาณ 133%) |
| แพดดิง | เติม = จนความยาวเป็นพหุคูณของ 4 |
| มาตรฐาน | RFC 4648 หัวข้อ 4 |
| แยกตัวพิมพ์เล็ก-ใหญ่ | ใช่ |
ตัวอย่าง
| อินพุต (UTF-8) | เอาต์พุต |
|---|---|
Hello, World! | SGVsbG8sIFdvcmxkIQ== |
Base64.is | QmFzZTY0Lmlz |
你好 | 5L2g5aW9 |
คำถามที่พบบ่อย
ทำไมเอาต์พุต Base64 ของฉันจึงต่างจากตัวเข้ารหัสอื่น
echo ในเชลล์จะเพิ่มให้หนึ่งตัว ให้ใช้ printf '%s' หรือ echo -n แทน) ใช้ชุดอักขระต่างกัน ข้อความมีการจบบรรทัดแบบ Windows หรือตั้งค่าแพดดิง ชุดตัวอักษร หรือการตัดบรรทัดไม่เหมือนกัน ไบต์เดียวกันที่ใช้ตัวเลือกเดียวกันจะให้ผลลัพธ์เดียวกันเสมอจะเข้ารหัสข้อความ Unicode เป็น Base64 ใน JavaScript ได้อย่างไร
btoa() รับเฉพาะอักขระที่มีค่าไม่เกิน U+00FF และจะเกิดข้อผิดพลาดกับอักขระอื่นทั้งหมด ให้แปลงสตริงเป็นไบต์ UTF-8 ก่อน เช่น btoa(String.fromCharCode(...new TextEncoder().encode(str))) ส่วนใน Node.js ให้ใช้ Buffer.from(str, 'utf8').toString('base64')จะเข้ารหัส Base64 ผ่านบรรทัดคำสั่งได้อย่างไร
printf '%s' 'your text' | base64 โดยค่าเริ่มต้น base64 ของ GNU จะตัดบรรทัดเอาต์พุตทุก 76 อักขระ (เพิ่ม -w 0 เพื่อให้ได้บรรทัดเดียว) ส่วน openssl base64 จะตัดทุก 64 อักขระ (เพิ่ม -A)การเข้ารหัส Base64 เป็นการเข้ารหัสลับหรือไม่
Base64 ทำให้ข้อมูลใหญ่ขึ้นเท่าใด
ทุก 3 ไบต์จะกลายเป็น 4 อักขระ โดยปัดขึ้นให้ครบกลุ่ม เอาต์พุตจึงใหญ่ขึ้นประมาณ 33% และการตัดบรรทัดแบบ MIME จะเพิ่มอีกสองไบต์ (CRLF) ทุก 76 อักขระ