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

แปลงข้อความ ไบต์เลขฐานสิบหก หรือไฟล์เป็น Base85 และแปลงกลับ หน้านี้ใช้ชุดอักขระ RFC 1924 ซึ่งเป็นรูปแบบที่ b85encode ของ Python สร้างขึ้นและใช้ในแพตช์ไบนารีของ Git

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

วิธีใช้งาน

  1. เลือก “เข้ารหัส” เพื่อแปลงข้อความหรือไบต์เป็น Base85 หรือเลือก “ถอดรหัส” เพื่อแปลง Base85 กลับเป็นข้อมูล
  2. พิมพ์หรือวางอินพุต หรือคลิก “เปิดไฟล์” หากทำงานกับไบต์ดิบ ให้ตั้ง “รูปแบบอินพุต” เป็น “เลขฐานสิบหก”
  3. ผลลัพธ์จะอัปเดตทันทีขณะที่คุณพิมพ์ เมื่อถอดรหัส ให้ตั้ง “รูปแบบเอาต์พุต” เป็น “ข้อความ” หรือ “เลขฐานสิบหก” ตามชนิดของข้อมูล
  4. กด “คัดลอก” เพื่อคัดลอกผลลัพธ์ หรือ “ดาวน์โหลด” เพื่อบันทึกเป็นไฟล์

Base85 คืออะไร

Base85 คือกลุ่มของการเข้ารหัสที่แปลงข้อมูลทุก 4 ไบต์เป็น 5 อักขระ เลขฐาน 85 ห้าหลักเก็บค่าได้ 85 × 85 × 85 × 85 × 85 = 4,437,053,125 ค่า ซึ่งเพียงพอสำหรับตัวเลข 32 บิตทุกค่าพอดี เอาต์พุตจึงใหญ่กว่าอินพุตเพียง 25% เทียบกับ 33% ของ Base64

Base85 มีชุดตัวอักษรหลายแบบและใช้แทนกันไม่ได้ ได้แก่ Ascii85 (Adobe, PDF) Z85 (ZeroMQ) และแบบที่ใช้ในหน้านี้ ซึ่งประกอบด้วย 0-9, A-Z, a-z และสัญลักษณ์อีก 23 ตัว ได้แก่ !#$%&()*+-;<=>?@^_`{|}~ โดยไม่มีเครื่องหมายอัญประกาศ จุลภาค มหัพภาค ทับ ทวิภาค แบ็กสแลช และวงเล็บเหลี่ยม

RFC 1924, Git และ Python

ชุดอักขระนี้มาจาก RFC 1924 “A Compact Representation of IPv6 Addresses” ซึ่งเผยแพร่เมื่อวันที่ 1 เมษายน 1996 เป็นเรื่องตลกวันเมษาหน้าโง่ โดยเสนอให้เขียนที่อยู่ IPv6 ขนาด 128 บิตเป็นเลขฐาน 85 ตัวเดียวที่ยาว 20 อักขระพอดี ไม่มีใครเขียนที่อยู่ IPv6 แบบนั้นจริง แต่ภายหลังชุดตัวอักษรนี้ถูกนำมาใช้กับข้อมูลไบนารีทั่วไป:

  • Git จัดเก็บไฟล์ไบนารีในแพตช์ (git diff --binary, git format-patch) เป็นข้อมูลที่บีบอัดด้วย zlib แล้วเข้ารหัสด้วยชุดตัวอักษรนี้ โดยมีอักขระบอกความยาวอยู่ที่ต้นแต่ละบรรทัด
  • Python ตั้งแต่เวอร์ชัน 3.4 มี base64.b85encode() และ b85decode() ซึ่งให้เอาต์พุตตรงกับเครื่องมือนี้
  • Mercurial ใช้การเข้ารหัสแบบเดียวกันสำหรับไฟล์ไบนารีใน diff แบบ Git

โปรดทราบว่า RFC 1924 แปลงที่อยู่ 128 บิตทั้งหมดในครั้งเดียว ขณะที่ Git, Python และเครื่องมือนี้ทำงานเป็นกลุ่มละ 4 ไบต์ ค่าขนาด 16 ไบต์จึงให้ผลลัพธ์ต่างจากวิธีของ RFC

กลุ่มสุดท้ายที่ไม่ครบ

เมื่อความยาวของอินพุตไม่ใช่พหุคูณของ 4 กลุ่มสุดท้ายจะถูกเติมด้วยไบต์ศูนย์ก่อนเข้ารหัส แล้วเก็บไว้เพียง n + 1 อักขระแรก คือ 1 ไบต์กลายเป็น 2 อักขระ 2 ไบต์กลายเป็น 3 อักขระ และ 3 ไบต์กลายเป็น 4 อักขระ ตัวถอดรหัสจะทำย้อนกลับ จึงไม่ต้องใช้อักขระแพดดิง รูปแบบนี้ไม่มีอักขระย่อสำหรับไบต์ศูนย์ ต่างจาก z ของ Ascii85

# Python 3.4+
import base64
base64.b85encode(b'hello')      # b'Xk~0{Zv'
base64.b85decode(b'Xk~0{Zv')    # b'hello'

ข้อกำหนด

ชุดตัวอักษร0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~
ขนาดเอาต์พุต5 อักขระต่อ 4 ไบต์ (125%)
แพดดิงไม่มี
มาตรฐานชุดอักขระตาม RFC 1924 (Git, Python b85)
แยกตัวพิมพ์เล็ก-ใหญ่ใช่

ตัวอย่าง

อินพุต (UTF-8)เอาต์พุต
Hello, World!NM&qnZ!92JZ*pv8Ap
Base64.isLSb`dHZ(42a{
你好<h`KfrM&

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

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

ไม่ใช่ เป็น RFC ประเภทให้ข้อมูล (informational) ที่เผยแพร่เป็นเรื่องตลกวันเมษาหน้าโง่ และไม่เคยถูกใช้กับที่อยู่ IPv6 เลย ชุดอักขระของมันได้รับความนิยมภายหลังผ่าน Git และ Python

เอาต์พุต Base85 ใหญ่ขึ้นเท่าใด
ทุก 4 ไบต์กลายเป็น 5 อักขระ เอาต์พุตจึงมีขนาด 1.25 เท่าของอินพุต ส่วน Base64 มีขนาดประมาณ 1.33 เท่า และ basE91 กะทัดรัดกว่านั้นอีกเล็กน้อย
ใส่ Base85 ใน JSON หรือ XML ได้หรือไม่
ใน JSON ได้ เพราะชุดตัวอักษรไม่มีเครื่องหมายอัญประกาศคู่หรือแบ็กสแลช จึงไม่ต้อง escape อะไรเลย แต่ใน XML และ HTML ต้อง escape อักขระ <, > และ & และ Base85 ไม่ปลอดภัยสำหรับ URL