วิธีใช้งาน
- เลือก “เข้ารหัส” เพื่อแปลงข้อความเป็น Base45 หรือ “ถอดรหัส” เพื่อแปลง Base45 กลับเป็นข้อความหรือไบต์
- พิมพ์หรือวางอินพุต หรือเปิดไฟล์ อย่าลบช่องว่างใด ๆ เพราะช่องว่างเป็นส่วนหนึ่งของชุดตัวอักษร
- เมื่อถอดรหัสข้อมูลไบนารี เช่น เพย์โหลดของใบรับรอง ให้เปลี่ยนเอาต์พุตเป็น “เลขฐานสิบหก”
- คัดลอกผลลัพธ์หรือดาวน์โหลดเป็นไฟล์
Base45 คืออะไร
Base45 กำหนดไว้ใน RFC 9285 ชุดตัวอักษรประกอบด้วยตัวเลข 0-9 ตัวอักษรพิมพ์ใหญ่ A-Z และสัญลักษณ์อีกเก้าตัว ได้แก่ช่องว่างและ $ % * + - . / : ซึ่งก็คืออักขระ 45 ตัวที่ QR code เก็บได้ในโหมดตัวอักษรและตัวเลขแบบกะทัดรัดพอดี โปรดทราบว่าช่องว่างเป็นอักขระจริงของชุดตัวอักษร ไม่ใช่ตัวคั่น
ตัวเข้ารหัสจะรับอินพุตครั้งละสองไบต์ อ่านเป็นตัวเลขตั้งแต่ 0 ถึง 65535 แล้วเขียนตัวเลขนั้นเป็นเลข Base45 สามหลัก โดยเริ่มจากหลักที่มีนัยสำคัญน้อยที่สุด ไบต์เดี่ยวที่เหลือท้ายสุดจะกลายเป็นอักขระสองตัว ในรูปข้อความ ผลลัพธ์มีขนาด 1.5 เท่าของอินพุต ซึ่งใหญ่กว่า Base64
ทำไม Base45 จึงเหมาะกับ QR code
ในโหมดตัวอักษรและตัวเลข QR code บรรจุอักขระสองตัวใน 11 บิต Base64 ใช้โหมดนี้ไม่ได้เพราะต้องใช้ตัวพิมพ์เล็ก จึงต้องใช้โหมดไบต์ซึ่งใช้อักขระละ 8 บิต หรือประมาณ 10.7 บิตต่อข้อมูลหนึ่งไบต์ ส่วน Base45 ใช้เพียง 8.25 บิตต่อไบต์ในโหมดตัวอักษรและตัวเลข ข้อมูลชุดเดียวกันจึงใส่ลงใน QR code ที่เล็กกว่าและสแกนง่ายกว่าได้
เมื่อถอดรหัส ให้คงช่องว่างไว้ตามเดิมทุกประการ มีเพียงการขึ้นบรรทัดใหม่เท่านั้นที่ถูกละเว้น ตัวพิมพ์เล็กไม่อยู่ในชุดตัวอักษรและจะถูกแจ้งว่าไม่ถูกต้อง
ถอดรหัสใบรับรองโควิดดิจิทัลของสหภาพยุโรป
QR code ของใบรับรองโควิดดิจิทัลของสหภาพยุโรป (EU Digital COVID Certificate) มีข้อความที่ขึ้นต้นด้วย HC1: ส่วนที่เหลือเป็น Base45 โดยข้อมูลใบรับรองถูกเข้ารหัสเป็น CBOR ลงลายเซ็นด้วย COSE บีบอัดด้วย zlib แล้วจึงเข้ารหัสเป็น Base45 หากต้องการดูข้อมูลภายใน ให้ทำดังนี้
- ลบตัวนำหน้า
HC1:ออก อักขระทั้งสี่ตัวนี้เป็น Base45 ที่ถูกต้อง หากไม่ลบออกจะได้ไบต์ที่ผิด - ถอดรหัสส่วนที่เหลือที่นี่โดยใช้เอาต์พุตแบบเลขฐานสิบหก ข้อมูล zlib มักขึ้นต้นด้วยไบต์
78 - คลายการบีบอัดไบต์ด้วย zlib และแยกวิเคราะห์ CBOR ด้วยเครื่องมืออื่น
เครื่องมือนี้จัดการเฉพาะขั้นตอน Base45 เท่านั้น ไม่ได้คลายการบีบอัด แยกวิเคราะห์ข้อมูล หรือตรวจสอบลายเซ็น
Base45 ในโค้ด
# Python (pip install base45)
import base45
base45.b45encode(b'AB') # ตัวอย่างจาก RFC 9285: BB8
base45.b45decode('BB8') # b'AB'
ข้อกำหนด
| ชุดตัวอักษร | 0-9 A-Z ช่องว่าง $ % * + - . / : |
|---|---|
| ขนาดเอาต์พุต | 3 อักขระต่อ 2 ไบต์ (150%) |
| แพดดิง | ไม่มี |
| มาตรฐาน | RFC 9285 |
| แยกตัวพิมพ์เล็ก-ใหญ่ | ใช่ |
ตัวอย่าง
| อินพุต (UTF-8) | เอาต์พุต |
|---|---|
Hello, World! | %69 VDK2E:3404ESVDX0 |
Base64.is | SH8LQEG%61*5P2 |
你好 | C-SEFK*.K |
คำถามที่พบบ่อย
ทำไมเอาต์พุต Base45 จึงมีช่องว่าง
ช่องว่างเป็นหนึ่งในอักขระ 45 ตัวของชุดตัวอักษร จึงบรรจุข้อมูลอยู่ด้วย อย่าตัดหรือยุบช่องว่างในข้อความ Base45 มิฉะนั้นการถอดรหัสจะล้มเหลวหรือได้ไบต์ที่ผิด
จะถอดรหัสสตริง HC1: ได้อย่างไร
ลบตัวนำหน้า HC1: ออก ถอดรหัสส่วนที่เหลือโดยใช้เอาต์พุตแบบเลขฐานสิบหก จากนั้นคลายการบีบอัดผลลัพธ์ด้วย zlib และอ่านข้อมูล CBOR ด้วยเครื่องมืออื่น เครื่องมือนี้ทำเฉพาะขั้นตอน Base45 เท่านั้น
Base45 แยกตัวพิมพ์เล็ก-ใหญ่หรือไม่
แยก มีเพียงตัวพิมพ์ใหญ่ที่อยู่ในชุดตัวอักษร เพราะโหมดตัวอักษรและตัวเลขของ QR code ไม่มีตัวพิมพ์เล็ก อินพุตตัวพิมพ์เล็กจะถูกแจ้งว่าไม่ถูกต้องพร้อมตำแหน่ง
Base45 กะทัดรัดกว่า Base64 หรือไม่
ในรูปข้อความธรรมดา ไม่ใช่ เพราะ Base45 มีขนาด 1.5 เท่าของอินพุต ส่วน Base64 ประมาณ 1.33 เท่า แต่ภายใน QR code ใช่ เพราะ Base45 ใช้โหมดตัวอักษรและตัวเลขที่บรรจุข้อมูลได้หนาแน่นกว่า