UuencodingUuencoding (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 до реальної кількості байтів з єдиним виключенням для символу гравіс <formatted characters> — закодовані символи. Деталі реалізації описані нижче у розділі «механізм форматування». Файл закінчується двома рядками `<newline> end<newline> Передостанній рядок містить символ «гравіс» як ознаку довжини у 0 байтів. Звичайний текстовий файл з назвою begin 644 cat.txt #0V%T ` end Алгоритм кодуванняАлгоритм кодування uuencoding повторює наступні операції для кожних трьох байтів:
Якщо довжина вхідного файлу не ділиться на 3, остання 4-байтова секція вихідного файлу міститиме байти-заповнювачі до найближчого кратного трьом значення. Ці байти не враховуються у полі <length character>, тому декодер не додасть до файлу небажані нуль-символи[en]. uudecoding працює обернено до описаного вище — віднімає 32 з ASCII-коду кожного символу, компонує чотири 6-бітові фрагменти у 24-бітове слово і видає на вихід 3 байти. Процес кодування для показаного вище рядка «Cat» показано у таблиці:
Таблиця кодівНаступна таблиця показує перетворення отриманих у процесі кодування 6-бітових полів у відповідні їм ASCII-коди та символи. Зауважте, що код 96 (
НедолікиUuencoding кодує кожні три байти вхідного файлу чотирма і додає теги початку та кінця, ім'я файлу і розділювачі. У порівнянні з первинним файлом це додає не менше, ніж 33 % додаткових витрат, які, втім, можуть бути компенсовані стисненням файлу перед кодуванням. Формат UUE походить з тих часів, коли не було формального визначення листа електронної пошти з підтримкою мультимедійних форматів. В більшості поштових клієнтів закодований бінарний файл виглядає як шматок «комп'ютерної абракадабри» в тексті повідомлення. На відміну від цього, у листі формату MIME всі вкладення[en] будуть відділені від тексту повідомлення, у більшості графічних клієнтів — з інтерактивними іконками для перегляду, зберігання та інших маніпуляцій з вкладеннями. MIME забезпечує підтримку різних типів вкладень та наборів символів. Незважаючи на обмежений набір символів, uuencode-дані іноді спотворюються при проходженні через деякі комп'ютери, які використовують не ASCII (наприклад, EBCDIC). Однією зі спроб виправити ситуацію був формат Xxencode[en], який використовує лише алфавітно-цифрові дані та символи «плюс» і «мінус». Найбільше поширення отримав формат 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
$
Посилання
|