อ่าน 4 นาที
uuencoding
uuencoding เป็นรูปแบบหนึ่งของ การเข้ารหัสไบนารีเป็นข้อความ ซึ่งมีต้นกำเนิดมาจากโปรแกรม Unix uuencode และ uudecode ที่เขียนโดย Mary Ann Horton ที่ มหาวิทยาลัยแคลิฟอร์เนีย...
uuencoding
uuencodingเป็นรูปแบบหนึ่งของการเข้ารหัสไบนารีเป็นข้อความซึ่งมีต้นกำเนิดมาจากโปรแกรมUnix uuencodeและuudecodeที่เขียนโดยMary Ann Hortonที่มหาวิทยาลัยแคลิฟอร์เนีย เบิร์กลีย์ในปี 1980 [ 1 ]สำหรับการเข้ารหัส ข้อมูล ไบนารีเพื่อส่งในระบบ อีเมล
ชื่อ "uuencoding" มาจากUnix-to-Unix Copyซึ่งก็คือ "การเข้ารหัสแบบ Unix-to-Unix" เป็นวิธีการเข้ารหัสที่ปลอดภัยสำหรับการถ่ายโอนไฟล์ใดๆ จากระบบ Unix หนึ่งไปยังอีกระบบ Unix หนึ่ง แต่ไม่มีการรับประกันว่าระบบที่เชื่อมต่อระหว่างกันจะเป็นระบบ Unix ทั้งหมด เนื่องจากข้อความอีเมลอาจถูกส่งต่อไปยังคอมพิวเตอร์ที่มีชุดอักขระ ต่างกัน หรือผ่านการขนส่งที่ไม่รองรับ 8 บิตหรือถูกจัดการโดยโปรแกรมที่ไม่รองรับ 8 บิต การส่งต่อไฟล์ไบนารีผ่านอีเมลอาจทำให้ไฟล์เสียหายได้ โดยการเข้ารหัสข้อมูลดังกล่าวลงในชุดอักขระย่อยที่ใช้ร่วมกันได้ในชุดอักขระส่วนใหญ่ รูปแบบที่เข้ารหัสของไฟล์ข้อมูลดังกล่าวจึงไม่น่าจะถูก "แปล" หรือเสียหาย และจะมาถึงปลายทางอย่างสมบูรณ์และไม่เปลี่ยนแปลง โปรแกรมuudecodeจะกลับผลของuuencodeโดยสร้างไฟล์ไบนารีต้นฉบับขึ้นมาใหม่ให้เหมือนเดิมทุกประการ uuencode/decode ได้รับความนิยมในการส่งไฟล์ไบนารี (โดยเฉพาะไฟล์ที่ถูกบีบอัด) ทางอีเมล และการโพสต์ไปยัง กลุ่มข่าว Usenetเป็นต้น
ปัจจุบัน MIMEและyEncได้เข้ามาแทนที่แล้วเป็นส่วนใหญ่ด้วย MIME ไฟล์ที่อาจเคยถูกเข้ารหัสแบบ uuencoded จะถูกส่งผ่านด้วยการเข้ารหัส Base64 แทน
รูปแบบการเข้ารหัส
ไฟล์ที่เข้ารหัสแบบ uuencoded จะเริ่มต้นด้วยบรรทัดส่วนหัวในรูปแบบ:
เริ่มต้น <โหมด> <ไฟล์><ขึ้นบรรทัดใหม่>
<mode>คือสิทธิ์การเข้าถึงไฟล์ในระบบ Unixซึ่งแสดงเป็นตัวเลขฐานแปดสามหลัก (เช่น 644, 744) โดยทั่วไปแล้ว ข้อมูลนี้จะมีความสำคัญเฉพาะกับระบบปฏิบัติการ ที่คล้าย Unix เท่านั้น
<file>คือชื่อไฟล์ที่จะใช้เมื่อสร้างข้อมูลไบนารีขึ้นใหม่
<newline>แสดงถึง อักขระ ขึ้นบรรทัดใหม่ซึ่งใช้เพื่อจบแต่ละบรรทัด
แต่ละบรรทัดข้อมูลใช้รูปแบบดังนี้:
<ความยาวอักขระ><อักขระที่จัดรูปแบบแล้ว><ขึ้นบรรทัดใหม่>
<length character>เป็นอักขระที่ระบุจำนวนไบต์ข้อมูลที่ถูกเข้ารหัสในบรรทัดนั้น นี่คือ อักขระ ASCIIที่กำหนดโดยการบวก 32 เข้ากับจำนวนไบต์จริง ยกเว้นเครื่องหมายเน้นเสียง "`" (รหัส ASCII 96) ซึ่งหมายถึงศูนย์ไบต์ บรรทัดข้อมูลทั้งหมด ยกเว้นบรรทัดสุดท้าย (หากความยาวข้อมูลไม่หารด้วย 45 ลงตัว) จะมีข้อมูลที่เข้ารหัส 45 ไบต์ (60 อักขระหลังจากการเข้ารหัส) ดังนั้น ค่าความยาวส่วนใหญ่จึงเป็น 'M' (32 + 45 = รหัส ASCII 77 หรือ "M")
<formatted characters>เป็นอักขระที่เข้ารหัสแล้ว ดูหัวข้อ§ กลไกการจัดรูปแบบสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการใช้งานจริง
ไฟล์นี้ลงท้ายด้วยสองบรรทัด:
`<ขึ้นบรรทัดใหม่> จบ<ขึ้นบรรทัดใหม่>
บรรทัดรองสุดท้ายเป็นอักขระที่ระบุความยาวของบรรทัด โดยเครื่องหมายเน้นเสียง (grave accent) หมายถึงศูนย์ไบต์
ไฟล์ข้อความธรรมดาชื่อ cat.txt ที่มีเฉพาะตัวอักษรCatจะถูกแปลง เป็นไฟล์ uuencoded ในรูปแบบสมบูรณ์ดังนี้
begin 644 cat.txt #0V%T ` จบ
บรรทัดเริ่มต้นเป็นส่วนหัวมาตรฐานของ uuencode โดยเครื่องหมาย '#' แสดงว่าบรรทัดนั้นเข้ารหัสอักขระสามตัว และสองบรรทัดสุดท้ายจะปรากฏที่ส่วนท้ายของไฟล์ที่เข้ารหัสด้วย uuencode ทั้งหมด
กลไกการจัดรูปแบบ
กลไกนี้จะuuencodingทำซ้ำขั้นตอนต่อไปนี้ทุกๆ 3 ไบต์ โดยเข้ารหัสเป็นอักขระที่พิมพ์ได้ 4 ตัว ซึ่งแต่ละอักขระแทนตัวเลขฐาน64 :
- เริ่มต้นด้วยข้อมูล 3 ไบต์จากแหล่งข้อมูลรวมทั้งหมด 24 บิต
- แบ่งออกเป็น 4 กลุ่ม กลุ่มละ 6 บิต โดยแต่ละกลุ่มแทนค่าในช่วง 0 ถึง 63 ได้แก่ บิต (00-05), (06-11), (12-17) และ (18-23)
- เพิ่ม 32 ให้กับแต่ละค่า การเพิ่ม 32 นี้หมายความว่าผลลัพธ์ที่เป็นไปได้จะอยู่ระหว่าง 32 (" " ช่องว่าง) และ 95 ("_" ขีดเส้นใต้ ) 96 ("`" เครื่องหมายเน้นเสียง ) เป็น "อักขระพิเศษ" ซึ่งเป็นการขยายเชิงตรรกะของช่วงนี้ แม้ว่าอักขระช่องว่างจะถูกบันทึกไว้ว่าเป็นการเข้ารหัสสำหรับค่า 0 แต่การใช้งาน เช่น GNU sharutils [ 2 ]จริงๆ แล้วใช้อักขระเน้นเสียงเพื่อเข้ารหัสศูนย์ในเนื้อหาของไฟล์เช่นกัน โดยไม่ใช้ช่องว่างเลย
- แสดงผลลัพธ์เป็นค่า ASCII ที่เทียบเท่ากับตัวเลขเหล่านี้
หากความยาวของข้อมูลต้นฉบับหารด้วย 3 ไม่ลงตัว ส่วน 4 ไบต์สุดท้ายจะประกอบด้วยไบต์เสริมเพื่อให้หารลงตัว ไบต์เหล่านี้จะถูกหักออกจากความยาวของบรรทัด<length character>เพื่อป้องกันไม่ให้ตัวถอดรหัสเพิ่มอักขระที่ไม่ต้องการลงในไฟล์
uudecodingเป็นกระบวนการย้อนกลับจากข้างต้น โดยลบ 32 ออกจากรหัส ASCII ของแต่ละตัวอักษร ( โมดูลัส 64 เพื่อคำนึงถึงการใช้เครื่องหมายเน้นเสียง) เพื่อให้ได้ค่า 6 บิต จากนั้นรวมกลุ่ม 6 บิต 4 กลุ่มเข้าด้วยกันเพื่อให้ได้ 24 บิต แล้วจึงส่งออกเป็น 3 ไบต์
ตารางนี้แสดงให้เห็นถึงกระบวนการเข้ารหัส โดยแสดงที่มาของการเข้ารหัสข้างต้นสำหรับคำว่า "Cat"
| ตัวละครดั้งเดิม | C | a | t | |||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ต้นฉบับ ASCII, ทศนิยม | 67 | 97 | 116 | |||||||||||||||||||||
| ASCII, ไบนารี | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
| ค่าทศนิยมใหม่ | 16 | 54 | 5 | 52 | ||||||||||||||||||||
| +32 | 48 | 86 | 37 | 84 | ||||||||||||||||||||
| อักขระที่เข้ารหัสแบบ uu | 0 | V | % | T | ||||||||||||||||||||
ตาราง uuencode
ตารางต่อไปนี้แสดงการแปลงค่าทศนิยมของฟิลด์ 6 บิตที่ได้ระหว่างกระบวนการแปลง และรหัสอักขระ ASCII และอักขระที่สอดคล้องกัน
โปรดทราบว่า ตัวเข้ารหัสบางตัวอาจสร้างช่องว่าง (รหัส 32) แทนเครื่องหมายเน้นเสียง ("`", รหัส 96) ในขณะที่ตัวถอดรหัสบางตัวอาจปฏิเสธการถอดรหัสข้อมูลที่มีช่องว่าง
| บิต | รหัสASCII | อักขระ ASCII | บิต | รหัสASCII | อักขระ ASCII | บิต | รหัสASCII | อักขระ ASCII | บิต | รหัสASCII | อักขระ ASCII | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00 | 96 | ` | 16 | 48 | 0 | 32 | 64 | @ | 48 | 80 | P | |||
| 01 | 33 | ! | 17 | 49 | 1 | 33 | 65 | A | 49 | 81 | Q | |||
| 02 | 34 | " | 18 | 50 | 2 | 34 | 66 | B | 50 | 82 | R | |||
| 03 | 35 | # | 19 | 51 | 3 | 35 | 67 | C | 51 | 83 | S | |||
| 04 | 36 | $ | 20 | 52 | 4 | 36 | 68 | D | 52 | 84 | T | |||
| 05 | 37 | % | 21 | 53 | 5 | 37 | 69 | E | 53 | 85 | U | |||
| 06 | 38 | & | 22 | 54 | 6 | 38 | 70 | F | 54 | 86 | V | |||
| 07 | 39 | ' | 23 | 55 | 7 | 39 | 71 | G | 55 | 87 | W | |||
| 08 | 40 | ( | 24 | 56 | 8 | 40 | 72 | H | 56 | 88 | X | |||
| 09 | 41 | ) | 25 | 57 | 9 | 41 | 73 | I | 57 | 89 | Y | |||
| 10 | 42 | * | 26 | 58 | : | 42 | 74 | J | 58 | 90 | Z | |||
| 11 | 43 | + | 27 | 59 | ; | 43 | 75 | K | 59 | 91 | [ | |||
| 12 | 44 | , | 28 | 60 | < | 44 | 76 | L | 60 | 92 | \ | |||
| 13 | 45 | - | 29 | 61 | = | 45 | 77 | M | 61 | 93 | ] | |||
| 14 | 46 | . | 30 | 62 | > | 46 | 78 | N | 62 | 94 | ^ | |||
| 15 | 47 | / | 31 | 63 | ? | 47 | 79 | O | 63 | 95 | _ |
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างการเข้ารหัส uu สำหรับไฟล์ข้อความบรรทัดเดียว ในตัวอย่างนี้%0Dคือไบต์แทนการขึ้นบรรทัดใหม่ (carriage return ) และ%0Aคือไบต์แทนการป้อนบรรทัดใหม่ (line feed )
- ไฟล์
ชื่อไฟล์ = wikipedia-url.txt เนื้อหาไฟล์ = http://www.wikipedia.org%0D%0A
- uuencoding
begin 644 wikipedia-url.txt ::'1T<#HO+W=W=RYW:6MI<&5D:6$N;W)G#0H` ` จบ
Forks (ไฟล์, ทรัพยากร)
โดยทั่วไปแล้ว Unix จะมี ฟอร์กเดียวที่ใช้เก็บข้อมูลไฟล์ อย่างไรก็ตาม ระบบไฟล์บางระบบรองรับฟอร์กหลายอันที่เชื่อมโยงกับไฟล์เดียว ตัวอย่างเช่นระบบไฟล์แบบลำดับชั้น (HFS) ของ Mac OS รุ่นคลาสสิก รองรับฟอร์กข้อมูลและฟอร์กทรัพยากร Mac OS HFS+รองรับฟอร์กหลายอัน เช่นเดียวกับสตรีมข้อมูลทางเลือก ของ Microsoft Windows NTFS เครื่องมือเข้ารหัส uucoding ส่วนใหญ่จะจัดการเฉพาะข้อมูลจากฟอร์กข้อมูลหลักเท่านั้น ซึ่งอาจส่งผลให้ข้อมูลสูญหายระหว่างการเข้ารหัส/ถอดรหัส (ตัวอย่างเช่น ความคิดเห็นในไฟล์ Windows NTFS จะถูกเก็บไว้ในฟอร์กอื่น) เครื่องมือบางอย่าง (เช่น แอปพลิเคชันUUTool ของ Mac OS รุ่นคลาสสิก ) แก้ปัญหานี้โดยการรวมฟอร์กต่างๆ เข้าด้วยกันเป็นไฟล์เดียวและแยกแยะความแตกต่างด้วยชื่อไฟล์
ความสัมพันธ์กับ xxencode, Base64 และ Ascii85
แม้ว่าข้อมูลที่เข้ารหัสแบบ uuencoded จะมีช่วงอักขระที่จำกัด แต่บางครั้งข้อมูลก็อาจเสียหายระหว่างการส่งผ่านคอมพิวเตอร์บางเครื่องที่ใช้ชุดอักขระที่ไม่ใช่ ASCII เช่นEBCDICความพยายามหนึ่งในการแก้ปัญหานี้คือรูปแบบ xxencode ซึ่งใช้เฉพาะตัวอักษรและตัวเลข รวมถึงสัญลักษณ์บวกและลบเท่านั้น ปัจจุบันรูปแบบที่นิยมใช้มากกว่าคือ Base64 ซึ่งมีพื้นฐานมาจากแนวคิดเดียวกันคือใช้ เฉพาะตัว อักษรและตัวเลขเท่านั้น ต่างจาก ASCII 32–95 ทั้งสามรูปแบบใช้ 6 บิต (64 ตัวอักษรที่แตกต่างกัน) ในการแสดงข้อมูลอินพุต
โปรแกรม uuencode สามารถสร้าง Base64 ได้เช่นกัน และมีรูปแบบคล้ายกัน ยกเว้นการแปลงตัวอักษรจริง:
ส่วนหัวถูกเปลี่ยนเป็น
begin-base64 <mode> <file>
ตัวอย่างกลายเป็น
====
และเส้นคั่นระหว่างเส้นจะถูกเข้ารหัสด้วยอักขระที่เลือกจาก
ABCDEFGHIJKLMNOP QRSTUVWXYZabcdef ghijklmnopqrstuv wxyz0123456789+/
อีกทางเลือกหนึ่งคือAscii85ซึ่งเข้ารหัสอักขระไบนารีสี่ตัวเป็นอักขระ ASCII ห้าตัว Ascii85 ใช้ในรูปแบบ PostScriptและPDF
ข้อเสีย
uuencoding จะแปลงข้อมูล 3 ไบต์ที่จัดรูปแบบไว้แล้วให้เป็น 4 ไบต์ และยังเพิ่มแท็กเริ่มต้น/สิ้นสุด ชื่อไฟล์ และตัวคั่นเข้าไปด้วย ซึ่งทำให้ปริมาณข้อมูลเพิ่มขึ้นอย่างน้อย 33% เมื่อเทียบกับไฟล์ต้นฉบับเพียงอย่างเดียว แต่สามารถชดเชยได้บ้างโดยการบีบอัดไฟล์ก่อนที่จะทำการเข้ารหัสด้วย uuencoding
การสนับสนุนในหลายภาษา
ไพธอน
ภาษาPythonรองรับการเข้ารหัสแบบ uu โดยใช้โมดูล codecs ร่วมกับโคเด็ก "uu":
สำหรับ Python 2 (เลิกใช้งาน/ยุติการสนับสนุนตั้งแต่วันที่ 1 มกราคม 2020) :
$ python -c 'print "Cat".encode("uu")' begin 666 <data> # 0V%T end$สำหรับ Python 3 ที่ต้องนำเข้าและใช้งานโมดูล codecs โดยตรง :
$ python3 -c "from codecs import encode;print(encode(b'Cat', 'uu'))" b'begin 666 <data>\n#0V%T\n \nend\n' $ในการถอดรหัส ให้ส่งไฟล์ทั้งหมด:
$ python3 -c "from codecs import decode;print(decode(b'begin 666 <data>\n#0V%T\n \nend\n', 'uu'))" b'Cat'เพิร์ล
ภาษาPerlรองรับการเข้ารหัสแบบ uu โดยตรงโดยใช้ตัวดำเนินการ pack() และ unpack() ร่วมกับสตริงรูปแบบ "u":
$ perl -e 'print pack("u","Cat")' # 0V%T การถอดรหัส base64 ด้วย unpack สามารถทำได้โดยการแปลงอักขระเช่นกัน:
$ perl -e 'print unpack("u","#0V%T")' Catในการสร้างไฟล์ uuencoded ที่มีรูปแบบถูกต้อง คุณต้องใช้โมดูล[ 3 ]หรือโค้ดเพิ่มเติมอีกเล็กน้อย: [ 4 ]
เข้ารหัส (บรรทัดเดียว)
$ perl -ple 'BEGIN{use File::Basename;$/=undef;$sn=basename($ARGV[0]);} $_= "begin 600 $sn\n".(pack "u", $_)."`\nend" if $_' /some/file/to_encode.gz พีพี
ภาษาPHPมีฟังก์ชัน convert_uuencode() ในตัว:
$ php -r "echo convert_uuencode('Cat');" # 0V%T `การถอดรหัสทำได้โดยใช้ฟังก์ชัน convert_uudecode() ที่เกี่ยวข้อง:
$ php -r "echo convert_uudecode('#0V%T');" Catดูเพิ่มเติม
- การเข้ารหัสไบนารีเป็นข้อความเพื่อเปรียบเทียบอัลกอริธึมการเข้ารหัสต่างๆ
ลิงก์ภายนอก
- รายการuuencodeใน POSIX.1-2008
- GNU-sharutils – ชุดยูทิลิตี้โอเพนซอร์สสำหรับ shar/unshar/uuencode/uudecode
- UUDeview – โปรแกรมโอเพนซอร์สสำหรับเข้ารหัส/ถอดรหัส Base64, BinHex, uuencode, xxencode และอื่นๆ สำหรับ Unix/Windows/DOS
- UUENCODE-UUDECODE – โปรแกรมโอเพนซอร์สสำหรับเข้ารหัส/ถอดรหัส สร้างโดย Clem "Grandad" Dye
- StUU – โปรแกรมถอดรหัส UUD ความเร็วสูงแบบโอเพนซอร์สสำหรับ Macintosh โดยStuart Cheshire
- UUENCODE-UUDECODE – เครื่องมือเข้ารหัส UUE และ UUDecoder ออนไลน์ฟรี
- Java UUDecoder – ไลบรารี Java โอเพนซอร์สสำหรับถอดรหัสไฟล์แนบที่เข้ารหัสแบบ uuencoded (อีเมล)
- AN11229 – เอกสารแนะนำการใช้งานของ NXP: การเข้ารหัส UU สำหรับ UART ISP
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ uuencoding
uuencoding เป็นรูปแบบหนึ่งของ การเข้ารหัสไบนารีเป็นข้อความ ซึ่งมีต้นกำเนิดมาจากโปรแกรม Unix uuencode และ uudecode ที่เขียนโดย Mary Ann Horton ที่ มหาวิทยาลัยแคลิฟอร์เนีย...
รูปแบบการเข้ารหัส
ไฟล์ที่เข้ารหัสแบบ uuencoded จะเริ่มต้นด้วยบรรทัดส่วนหัวในรูปแบบ:
กลไกการจัดรูปแบบ
กลไกนี้จะ uuencoding ทำซ้ำขั้นตอนต่อไปนี้ทุกๆ 3 ไบต์ โดยเข้ารหัสเป็นอักขระที่พิมพ์ได้ 4 ตัว ซึ่งแต่ละอักขระแทน ตัวเลขฐาน 64 :
ตาราง uuencode
ตารางต่อไปนี้แสดงการแปลงค่าทศนิยมของฟิลด์ 6 บิตที่ได้ระหว่างกระบวนการแปลง และรหัสอักขระ ASCII และอักขระที่สอดคล้องกัน