ตัวเข้ารหัสและถอดรหัส Ascii85

แปลงข้อความ ไบต์เลขฐานสิบหก หรือไฟล์เป็น Ascii85 ซึ่งเป็น Base85 รูปแบบที่ใช้ใน PostScript และ PDF และแปลงกลับ เพิ่มตัวกำหนดขอบเขตของ Adobe หรือตัดเอาต์พุตที่ยาวเป็นหลายบรรทัดได้

ทำงานภายในเบราว์เซอร์ของคุณทั้งหมด ไม่มีการอัปโหลดข้อมูลใด ๆ

วิธีใช้งาน

  1. เลือก “เข้ารหัส” เพื่อแปลงข้อความหรือไบต์เป็น Ascii85 หรือเลือก “ถอดรหัส” เพื่อแปลง Ascii85 กลับเป็นข้อมูล
  2. เปิด “ตัวกำหนดขอบเขต <~ ~>” หากจะนำเอาต์พุตไปใช้ใน PostScript หรือต้องให้ตรงกับ a85encode ของ Python ที่ตั้ง adobe=True
  3. ตั้งค่า “ตัดบรรทัด” ได้ตามต้องการ เพื่อแบ่งเอาต์พุตที่ยาวเป็นหลายบรรทัด
  4. พิมพ์ วาง หรือคลิก “เปิดไฟล์” จากนั้นกด “คัดลอก” หรือ “ดาวน์โหลด” เพื่อรับผลลัพธ์ เมื่อถอดรหัส ตัวกำหนดขอบเขต ช่องว่าง และการขึ้นบรรทัดใหม่จะถูกละเว้น

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.is6=FqH2Dd%#Er
你好jLq5JV7c

คำถามที่พบบ่อย

Ascii85 กับ Base85 ต่างกันอย่างไร
ทั้งสองเข้ารหัส 4 ไบต์เป็น 5 อักขระ แต่ใช้ชุดตัวอักษรต่างกัน Ascii85 ใช้ช่วงตั้งแต่ ! ถึง u และมีอักขระย่อ z ส่วนหน้า Base85 ใช้ชุดตัวอักษร RFC 1924 ของ Git และ b85encode ของ Python และ Z85 คือรูปแบบของ ZeroMQ
ทำไมเอาต์พุตของฉันจึงมีตัวอักษร z
z แต่ละตัวแทนไบต์ศูนย์สี่ไบต์ในกลุ่มที่ครบ ตัวถอดรหัสจะขยายกลับให้โดยอัตโนมัติ ข้อมูลจึงไม่เปลี่ยนแปลง
จำเป็นต้องใช้ตัวกำหนดขอบเขตของ Adobe หรือไม่

จำเป็นเฉพาะเมื่อโปรแกรมที่อ่านข้อมูลต้องการ เช่น ตัวแปลภาษา PostScript หรือ a85decode ของ Python ที่ตั้ง adobe=True เครื่องมือหลายตัวรับ Ascii85 ที่ไม่มีตัวกำหนดขอบเขตได้ เมื่อถอดรหัสในหน้านี้ จะมีตัวกำหนดขอบเขตหรือไม่ก็ได้

ถอดรหัสสตรีม ASCII85 จาก PDF ได้หรือไม่

ได้ วางข้อมูลสตรีมแล้วเลือกเอาต์พุตเป็น “เลขฐานสิบหก” หรือดาวน์โหลดผลลัพธ์ หากฟิลเตอร์ของสตรีมระบุ FlateDecode ไว้ถัดจาก ASCII85Decode ไบต์ที่ถอดรหัสได้จะยังถูกบีบอัดด้วย zlib อยู่ และต้องคลายการบีบอัดอีกขั้นหนึ่ง

ทำไมจึงพบข้อผิดพลาดว่าอักขระไม่ถูกต้อง
Ascii85 อนุญาตเฉพาะอักขระตั้งแต่ ! ถึง u และ z ระหว่างกลุ่มเท่านั้น อักขระย่อ y แทนช่องว่างสี่ตัว ซึ่ง btoa บางเวอร์ชันและ Python ที่ตั้ง foldspaces=True ใช้อยู่ ไม่ได้เป็นส่วนหนึ่งของรูปแบบ Adobe และจะถูกปฏิเสธ