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

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

uudecoding працює обернено до описаного вище — віднімає 32 з ASCII-коду кожного символу, компонує чотири 6-бітові фрагменти у 24-бітове слово і видає на вихід 3 байти.

Процес кодування для показаного вище рядка «Cat» показано у таблиці:

Початкові символи C a t Десятковий код ASCII 67 97 116 Двійковий код ASCII 0 1 0 0 00 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символASCII0032 16480 3264@ 4880P0133! 17491 3365A 4981Q0234" 18502 3466B 5082R0335# 19513 3567C 5183S0436$ 20524 3668D 5284T0537% 21535 3769E 5385U0638& 22546 3870F 5486V0739' 23557 3971G 5587W0840( 24568 4072H 5688X0941) 25579 4173I 5789Y1042* 2658: 4274J 5890Z1143+ 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). Однією зі спроб виправити ситуацію був формат , який використовує лише алфавітно-цифрові дані та символи «плюс» і «мінус». Найбільше поширення отримав формат 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