วิธีใช้งาน
- เลือก “เข้ารหัส” เพื่อแปลงข้อความหรือไบต์เป็น Ascii85 หรือเลือก “ถอดรหัส” เพื่อแปลง Ascii85 กลับเป็นข้อมูล
- เปิด “ตัวกำหนดขอบเขต <~ ~>” หากจะนำเอาต์พุตไปใช้ใน PostScript หรือต้องให้ตรงกับ a85encode ของ Python ที่ตั้ง adobe=True
- ตั้งค่า “ตัดบรรทัด” ได้ตามต้องการ เพื่อแบ่งเอาต์พุตที่ยาวเป็นหลายบรรทัด
- พิมพ์ วาง หรือคลิก “เปิดไฟล์” จากนั้นกด “คัดลอก” หรือ “ดาวน์โหลด” เพื่อรับผลลัพธ์ เมื่อถอดรหัส ตัวกำหนดขอบเขต ช่องว่าง และการขึ้นบรรทัดใหม่จะถูกละเว้น
Ascii85 คืออะไร
Ascii85 อ่านอินพุตครั้งละ 4 ไบต์ มองแต่ละกลุ่มเป็นตัวเลข 32 บิต แล้วเขียนเป็นเลขฐาน 85 ห้าหลัก หลักเหล่านี้คืออักขระ ASCII 85 ตัวที่เรียงต่อกันตั้งแต่ ! (รหัส 33) ถึง u (รหัส 117) โดยอักขระแต่ละตัวก็คือค่าของหลักบวก 33 นั่นเอง เอาต์พุตใหญ่กว่าอินพุต 25% เทียบกับ 33% ของ Base64
รูปแบบนี้ถูกใช้ครั้งแรกในยูทิลิตี btoa ของ Unix ต่อมา Adobe นำมาใช้เป็นการเข้ารหัส ASCII ฐาน 85 ของ PostScript Level 2 และ PDF ซึ่งช่วยให้ข้อมูลไบนารี เช่น รูปภาพและฟอนต์ บรรจุอยู่ในไฟล์ข้อความธรรมดาได้ Python มีให้ใช้ในชื่อ base64.a85encode() และ Go มีแพ็กเกจ encoding/ascii85
อักขระย่อ z และตัวกำหนดขอบเขตของ Adobe
โดยปกติกลุ่มของไบต์ศูนย์สี่ไบต์จะถูกเขียนเป็นเครื่องหมายอัศเจรีย์ห้าตัว แต่ Ascii85 เขียนเป็น z ตัวเดียวแทน ทำให้ช่วงข้อมูลว่างยาว ๆ สั้นลง อักขระย่อนี้ใช้กับกลุ่มที่ครบเท่านั้น เมื่อความยาวของอินพุตไม่ใช่พหุคูณของ 4 กลุ่มสุดท้ายที่มี n ไบต์จะกลายเป็น n + 1 อักขระ และจะไม่ถูกย่อ
PostScript ระบุสตริง Ascii85 ด้วย <~ ที่ต้นและ ~> ที่ท้าย ส่วนในสตรีม PDF ที่ใช้ฟิลเตอร์ ASCII85Decode จะใช้เพียง ~> ที่ปิดท้ายเป็นเครื่องหมายสิ้นสุดข้อมูล ตัวถอดรหัสในหน้านี้จะลบตัวกำหนดขอบเขตทั้งสองแบบออกหากมี และละเว้นอักขระช่องว่าง คุณจึงวางข้อมูลสตรีมจากไฟล์ PDF หรือ PostScript ได้โดยตรง
การใช้ Ascii85 ในโค้ด
# Python 3.4+
import base64
base64.a85encode(b'hello') # b'BOu!rDZ'
base64.a85encode(b'hello', adobe=True) # b'<~BOu!rDZ~>'
base64.a85decode(b'<~BOu!rDZ~>', adobe=True) # b'hello'
// Go
import "encoding/ascii85"
dst := make([]byte, ascii85.MaxEncodedLen(len(src)))
n := ascii85.Encode(dst, src)
ข้อกำหนด
| ชุดตัวอักษร | ASCII 33 (!) ถึง 117 (u) และ z |
|---|---|
| ขนาดเอาต์พุต | 5 อักขระต่อ 4 ไบต์ (125%) |
| แพดดิง | ไม่มี ใช้ตัวกำหนดขอบเขต <~ ~> ได้ตามต้องการ |
| มาตรฐาน | Adobe PostScript และ PDF |
| แยกตัวพิมพ์เล็ก-ใหญ่ | ใช่ |
ตัวอย่าง
| อินพุต (UTF-8) | เอาต์พุต |
|---|---|
Hello, World! | 87cURD_*#4DfTZ)+T |
Base64.is | 6=FqH2Dd%#Er |
你好 | jLq5JV7c |
คำถามที่พบบ่อย
Ascii85 กับ Base85 ต่างกันอย่างไร
ทำไมเอาต์พุตของฉันจึงมีตัวอักษร z
z แต่ละตัวแทนไบต์ศูนย์สี่ไบต์ในกลุ่มที่ครบ ตัวถอดรหัสจะขยายกลับให้โดยอัตโนมัติ ข้อมูลจึงไม่เปลี่ยนแปลงจำเป็นต้องใช้ตัวกำหนดขอบเขตของ Adobe หรือไม่
จำเป็นเฉพาะเมื่อโปรแกรมที่อ่านข้อมูลต้องการ เช่น ตัวแปลภาษา PostScript หรือ a85decode ของ Python ที่ตั้ง adobe=True เครื่องมือหลายตัวรับ Ascii85 ที่ไม่มีตัวกำหนดขอบเขตได้ เมื่อถอดรหัสในหน้านี้ จะมีตัวกำหนดขอบเขตหรือไม่ก็ได้
ถอดรหัสสตรีม ASCII85 จาก PDF ได้หรือไม่
ได้ วางข้อมูลสตรีมแล้วเลือกเอาต์พุตเป็น “เลขฐานสิบหก” หรือดาวน์โหลดผลลัพธ์ หากฟิลเตอร์ของสตรีมระบุ FlateDecode ไว้ถัดจาก ASCII85Decode ไบต์ที่ถอดรหัสได้จะยังถูกบีบอัดด้วย zlib อยู่ และต้องคลายการบีบอัดอีกขั้นหนึ่ง
ทำไมจึงพบข้อผิดพลาดว่าอักขระไม่ถูกต้อง
! ถึง u และ z ระหว่างกลุ่มเท่านั้น อักขระย่อ y แทนช่องว่างสี่ตัว ซึ่ง btoa บางเวอร์ชันและ Python ที่ตั้ง foldspaces=True ใช้อยู่ ไม่ได้เป็นส่วนหนึ่งของรูปแบบ Adobe และจะถูกปฏิเสธ