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