วิธีใช้งาน
- เลือก “เข้ารหัส” เพื่อสร้างบล็อก uuencode หรือเลือก “ถอดรหัส” เพื่อดึงข้อมูลกลับจากบล็อกนั้น
- เปิด “บรรทัด begin / end” ไว้และป้อน “ชื่อไฟล์” หากต้องการให้ผลลัพธ์ใช้กับคำสั่ง uudecode ได้ ปิดตัวเลือกนี้หากต้องการเฉพาะบรรทัดข้อมูล
- พิมพ์หรือวางอินพุต หรือคลิก “เปิดไฟล์” เพื่อเข้ารหัสไบต์ของไฟล์
- เมื่อถอดรหัส ให้วางทั้งบล็อกรวมถึงบรรทัด begin หากมี จากนั้นกด “คัดลอก” หรือ “ดาวน์โหลด” เพื่อรับผลลัพธ์
uuencode คืออะไร
Uuencode ย่อมาจาก Unix-to-Unix encode เกิดขึ้นราวปี 1980 ในยุคที่การคัดลอกไฟล์ระหว่างเครื่อง Unix ทำผ่านการเชื่อมต่อ UUCP ที่รับส่งได้เฉพาะข้อความ uuencode แปลงข้อมูลทุก 3 ไบต์เป็นค่า 6 บิตสี่ค่า แล้วบวก 32 เข้ากับแต่ละค่า จึงได้อักขระที่พิมพ์ได้ตั้งแต่ช่องว่างจนถึงขีดล่าง เนื่องจากระบบอีเมลมักตัดช่องว่างท้ายบรรทัดทิ้ง ค่าศูนย์จึงเขียนเป็นแบ็กทิก (`) แทนช่องว่าง ซึ่งเครื่องมือนี้ก็ทำเช่นเดียวกัน
ไฟล์ uuencode มีโครงสร้างตายตัวดังนี้
- บรรทัดส่วนหัว
begin 644 nameโดย 644 คือโหมดไฟล์ของ Unix ในเลขฐานแปด (เจ้าของอ่านและเขียนได้ ผู้อื่นอ่านได้อย่างเดียว) และ name คือชื่อไฟล์ที่จะสร้าง - บรรทัดข้อมูล บรรทัดละไม่เกิน 45 ไบต์ของอินพุต แต่ละบรรทัดขึ้นต้นด้วยอักขระบอกความยาว (32 บวกจำนวนไบต์ บรรทัดที่เต็มจึงขึ้นต้นด้วย
M) ตามด้วยอักขระที่เข้ารหัสแล้วไม่เกิน 60 ตัว - บรรทัดที่มีแบ็กทิกเพียงตัวเดียว ซึ่งหมายถึงศูนย์ไบต์ ตามด้วยบรรทัด
end
เมื่อรวมอักขระบอกความยาวและการขึ้นบรรทัดใหม่แล้ว เอาต์พุตจะใหญ่กว่าอินพุตประมาณ 38%
uuencode ในปัจจุบัน
ก่อนมี MIME นั้น uuencode เป็นวิธีมาตรฐานในการส่งโปรแกรมและรูปภาพทางอีเมลและโพสต์ลง Usenet ต่อมา Base64 ของ MIME เข้ามาแทนที่ในช่วงทศวรรษ 1990 เพราะ uuencode ไม่มีวิธีระบุชนิดของเนื้อหา มีหลายรูปแบบที่ใช้ร่วมกันไม่ได้ และเครื่องหมายวรรคตอนบางตัวถูกเปลี่ยนโดยเกตเวย์ระหว่างระบบ ASCII กับ EBCDIC ซึ่งเป็นเหตุผลที่มีการสร้าง xxencode ขึ้นมา
ทุกวันนี้ยังพบข้อมูล uuencode ได้ในคลังอีเมลและข่าว สคริปต์เชลล์รุ่นเก่า และระบบดั้งเดิม สำหรับงานใหม่ ให้ใช้ Base64 หรือ ไฟล์เป็น Base64 สำหรับไฟล์ทั้งไฟล์
uuencode บนบรรทัดคำสั่งและใน Python
# เชลล์ (GNU sharutils): ไฟล์อินพุต ตามด้วยชื่อสำหรับบรรทัด begin
uuencode photo.jpg photo.jpg > photo.uu
uudecode photo.uu
# Python: ครั้งละหนึ่งบรรทัด ไม่เกิน 45 ไบต์
import binascii
line = binascii.b2a_uu(b'hello', backtick=True)
binascii.a2b_uu(line) # b'hello'
โมดูล uu แบบเก่าของ Python ถูกนำออกใน Python 3.13 แต่ฟังก์ชันใน binascii ยังคงใช้ได้
ข้อกำหนด
| ชุดตัวอักษร | ASCII 32 ถึง 96 (ช่องว่างถึง `) |
|---|---|
| ขนาดเอาต์พุต | ประมาณ 137% รวมอักขระนำหน้าบรรทัด |
| แพดดิง | บรรทัดละไม่เกิน 45 ไบต์ |
| มาตรฐาน | POSIX uuencode |
| แยกตัวพิมพ์เล็ก-ใหญ่ | ใช่ |
ตัวอย่าง
| อินพุต (UTF-8) | เอาต์พุต |
|---|---|
Hello, World! | begin 644 data.bin
-2&5L;&\L(%=O<FQD(0``
`
end |
Base64.is | begin 644 data.bin
)0F%S938T+FES
`
end |
你好 | begin 644 data.bin
&Y+V@Y:6]
`
end |
คำถามที่พบบ่อย
ทำไมข้อความ uuencode จึงมีแบ็กทิก
ค่าศูนย์จะตรงกับช่องว่าง และช่องว่างท้ายบรรทัดมักสูญหายระหว่างการส่ง ตัวเข้ารหัสหลายตัว รวมถึงตัวนี้ จึงเขียนเป็นแบ็กทิกแทน ตัวถอดรหัสรับได้ทั้งสองแบบ
begin 644 หมายความว่าอะไร
เป็นจุดเริ่มต้นของบล็อกที่เข้ารหัส 644 คือโหมดสิทธิ์ของ Unix สำหรับไฟล์ที่กู้คืน (เจ้าของอ่านและเขียนได้ ผู้อื่นอ่านได้อย่างเดียว) และคำที่ตามมาคือชื่อไฟล์ที่ uudecode จะสร้าง คุณกำหนดชื่อได้ในตัวเลือก “ชื่อไฟล์”
ถอดรหัส uuencode ที่ไม่มีบรรทัด begin ได้หรือไม่
ได้ หากไม่มีบรรทัด begin ทุกบรรทัดจะถูกถอดรหัสเป็นข้อมูล หากมี การถอดรหัสจะเริ่มหลังบรรทัดนั้นและหยุดที่บรรทัด end ข้อความรอบบล็อก เช่น เนื้อความอีเมล จึงถูกข้ามไป ช่องว่างท้ายบรรทัดที่ซอฟต์แวร์อีเมลตัดทิ้งจะถูกเติมกลับให้โดยอัตโนมัติ
uuencode เหมือนกับ Base64 หรือไม่
ไม่เหมือน ทั้งสองแปลง 3 ไบต์เป็น 4 อักขระ แต่ uuencode ใช้ช่วงอักขระต่างกัน มีอักขระบอกความยาวในแต่ละบรรทัด และมีบรรทัด begin และ end เอาต์พุต Base64 จึงถอดรหัสเป็น uuencode ไม่ได้ และกลับกันก็ไม่ได้เช่นกัน