Uuencoding

Uuencoding (UUE) — вид кодування двійкових даних, який бере початок від Unix-програми uuencode і спочатку використовувався для кодування двійкових даних з метою передавання через поштову систему UUCP.

Назва uuencoding походить віл Unix-to-Unix encoding. Оскільки UUCP конвертує символи між різними наборами, uuencode використовується для конвертування даних, які не повинні транслюватися при переході між наборами символів. Шляхом кодування таких даних у підмножину символів, спільну для більшості наборів, закодована форма таких файлів малоймовірно буде зруйнована «транслюванням». Програма uudecode здійснює зворотню дію до uuencode, точно відтворюючи початковий двійковий файл. Пара uuencode/uudecode стала популярною для пересилання бінарних файлів електронною поштою або опублікування їх у групах новин Usenet.

Формат закодованих даних

Закодований файл починається заголовком виду:

begin <mode> <file><newline>

<mode> права доступу до файлу як три вісімкові цифри, наприклад 644, 744. Як правило мають значення дише для unix-like операційних систем.

<file> — ім'я файлу, яке має бути використане при створенні відновленого файлу.

<newline> — символ newline, використовується для закінчення рядка.

Кожен рядок даних використовує наступний формат:

<length character><formatted characters><newline>

<length character> — символ, який позначає кількість байтів даних, закодованих у цьому рядку. Це ASCII-символ, отриманий додаванням 32 до реальної кількості байтів з єдиним виключенням для символу гравіс ` (ASCII-код 96), який позначає 0 байтів. Всі рядки даних, крім останнього (якщо довжина не кратна 45), мають 45 байтів закодованих даних (60 символів після кодування). Відповідно, більшість символів довжини є «М», (32 + 45 = код ASCII 77, тобто «М»).

<formatted characters> — закодовані символи. Деталі реалізації описані нижче у розділі «механізм форматування».

Файл закінчується двома рядками

`<newline>
 end<newline>

Передостанній рядок містить символ «гравіс» як ознаку довжини у 0 байтів.

Звичайний текстовий файл з назвою cat.txt, що складається лише з символів Cat, після кодування матиме вигляд:

begin 644 cat.txt
#0V%T
`
end

Алгоритм кодування

Алгоритм кодування uuencoding повторює наступні операції для кожних трьох байтів:

  1. Взяти 3 байти з вхідного потоку, загалом 24 біти.
  2. Розбити порцію на чотири 6-бітових групи, кожна з яких дає числа в діапазоні від 0 до 63: біти (00-05), (06-11), (12-17) та (18-23).
  3. Додати 32 до кожного значення. Таким чином, можливі результати можуть бути від 32 (  пробіл) до 95 (_ знак підкреслення). Розширює цей діапазон код 96 (` гравіс), який використовується як «спеціальний символ».
  4. Передати на вихід ASCII-еквіваленти отриманих чисел.

Якщо довжина вхідного файлу не ділиться на 3, остання 4-байтова секція вихідного файлу міститиме байти-заповнювачі до найближчого кратного трьом значення. Ці байти не враховуються у полі <length character>, тому декодер не додасть до файлу небажані нуль-символи.

uudecoding працює обернено до описаного вище — віднімає 32 з ASCII-коду кожного символу, компонує чотири 6-бітові фрагменти у 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
Символи uuencode 0 V % T

Таблиця кодів

Наступна таблиця показує перетворення отриманих у процесі кодування 6-бітових полів у відповідні їм ASCII-коди та символи.

Зауважте, що код 96 (` гравіс) зустрічається у закодованих файлах, але зазвичай він використовується лише для позначення рядка нульової довжини в кінці файлу. Він ніколи не виникає у реальних конвертованих даних природним чином, оскільки його код виходить за межі діапазону від 32 до 95. Єдиним винятком є те, що деякі програми використовували символ «гравіс» замість пробілу для позначення байтів-заповнювачів. Однак, символ для позначення байтів-заповнювачів не стандартизовано, тому можливе використання будь-якого з цих двох.

шість
бітів
код
ASCII
символ
ASCII
шість
бітів
код
ASCII
символ
ASCII
шість
бітів
код
ASCII
символ
ASCII
шість
бітів
код
ASCII
символ
ASCII
0032SP  16480  3264@  4880P
0133!  17491  3365A  4981Q
0234"  18502  3466B  5082R
0335#  19513  3567C  5183S
0436$  20524  3668D  5284T
0537%  21535  3769E  5385U
0638&  22546  3870F  5486V
0739'  23557  3971G  5587W
0840(  24568  4072H  5688X
0941)  25579  4173I  5789Y
1042*  2658:  4274J  5890Z
1143+  2759;  4375K  5991[
1244,  2860<  4476L  6092\
1345-  2961=  4577M  6193]
1446.  3062>  4678N  6294^
1547/  3163?  4779O  6395_

Недоліки

Uuencoding кодує кожні три байти вхідного файлу чотирма і додає теги початку та кінця, ім'я файлу і розділювачі. У порівнянні з первинним файлом це додає не менше, ніж 33 % додаткових витрат, які, втім, можуть бути компенсовані стисненням файлу перед кодуванням.

Формат UUE походить з тих часів, коли не було формального визначення листа електронної пошти з підтримкою мультимедійних форматів. В більшості поштових клієнтів закодований бінарний файл виглядає як шматок «комп'ютерної абракадабри» в тексті повідомлення. На відміну від цього, у листі формату MIME всі вкладення будуть відділені від тексту повідомлення, у більшості графічних клієнтів — з інтерактивними іконками для перегляду, зберігання та інших маніпуляцій з вкладеннями. MIME забезпечує підтримку різних типів вкладень та наборів символів.

Незважаючи на обмежений набір символів, uuencode-дані іноді спотворюються при проходженні через деякі комп'ютери, які використовують не ASCII (наприклад, EBCDIC). Однією зі спроб виправити ситуацію був формат Xxencode, який використовує лише алфавітно-цифрові дані та символи «плюс» і «мінус». Найбільше поширення отримав формат Base64, який також базується на концепції кодування лише алфавітно-цифровими символами на відміну від ASCII-діапазону 32–95, який включає пробіл та різноманітні символи пунктуації. Всі три формати використовують 6 бітів (64 різних символи) для кодування вхідних даних.

Іншою альтернативою є формат Ascii85, який кодує чотири двійкові байти п'ятьма ASCII-символами. Ascii85 застосовується для кодування даних у форматах PostScript та PDF.

Підтримка в Python

Мова програмування Python підтримує uuencoding за допомогою кодека uu модуля codecs:

$ python -c 'print "Cat".encode("uu")'
begin 666 <data>
#0V%T

end

$ python -c 'print "begin 666 <data>\n#0V%T\n \nend\n".decode("uu")'
Cat
$

Підтримка в Perl

Мова програмування Perl підтримує uuencoding за допомогою операторів pack() та unpack() з форматним рядком «u»:

$ perl -e 'print pack("u","Cat")'
#0V%T
$ perl -e 'print unpack("u", "#0V%T"), "\n"'
Cat
$

Посилання

  • uuencode в POSIX.1-2008
  • UUENCODE-UUDECODE — вільний онлайновий конвертор
  • GNU-sharutils open source набір утиліт shar/unshar/uuencode/uudecode для GNU Linux
  • UUDeview — open-source програма для кодування/декодування Base64, BinHex, uuencode, xxencode і т. д. для Unix/Windows/DOS
  • StUU — Open Source UUDecoder для Macintosh
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.