Топ питань
Часова шкала
Чат
Перспективи
Uuencoding
вид кодування бінарних даних З Вікіпедії, вільної енциклопедії
Remove ads
Uuencoding (UUE) — вид кодування двійкових даних, який бере початок від Unix-програми uuencode і спочатку використовувався для кодування двійкових даних з метою передавання через поштову систему UUCP.
Назва uuencoding походить віл Unix-to-Unix encoding. Оскільки UUCP конвертує символи між різними наборами, uuencode використовується для конвертування даних, які не повинні транслюватися при переході між наборами символів. Шляхом кодування таких даних у підмножину символів, спільну для більшості наборів, закодована форма таких файлів малоймовірно буде зруйнована «транслюванням». Програма uudecode здійснює зворотню дію до uuencode, точно відтворюючи початковий двійковий файл. Пара uuencode/uudecode стала популярною для пересилання бінарних файлів електронною поштою або опублікування їх у групах новин Usenet.
Remove ads
Формат закодованих даних
Узагальнити
Перспектива
Закодований файл починається заголовком виду:
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
Remove ads
Алгоритм кодування
Узагальнити
Перспектива
Алгоритм кодування uuencoding повторює наступні операції для кожних трьох байтів:
- Взяти 3 байти з вхідного потоку, загалом 24 біти.
- Розбити порцію на чотири 6-бітових групи, кожна з яких дає числа в діапазоні від 0 до 63: біти (00-05), (06-11), (12-17) та (18-23).
- Додати 32 до кожного значення. Таким чином, можливі результати можуть бути від 32 (
_
знак підкреслення). Розширює цей діапазон код 96 (`
гравіс), який використовується як «спеціальний символ». - Передати на вихід ASCII-еквіваленти отриманих чисел.
Якщо довжина вхідного файлу не ділиться на 3, остання 4-байтова секція вихідного файлу міститиме байти-заповнювачі до найближчого кратного трьом значення. Ці байти не враховуються у полі <length character>, тому декодер не додасть до файлу небажані нуль-символи[en].
uudecoding працює обернено до описаного вище — віднімає 32 з ASCII-коду кожного символу, компонує чотири 6-бітові фрагменти у 24-бітове слово і видає на вихід 3 байти.
Процес кодування для показаного вище рядка «Cat» показано у таблиці:
Remove ads
Таблиця кодів
Узагальнити
Перспектива
Наступна таблиця показує перетворення отриманих у процесі кодування 6-бітових полів у відповідні їм ASCII-коди та символи.
Зауважте, що код 96 (`
гравіс) зустрічається у закодованих файлах, але зазвичай він використовується лише для позначення рядка нульової довжини в кінці файлу. Він ніколи не виникає у реальних конвертованих даних природним чином, оскільки його код виходить за межі діапазону від 32 до 95. Єдиним винятком є те, що деякі програми використовували символ «гравіс» замість пробілу для позначення байтів-заповнювачів. Однак, символ для позначення байтів-заповнювачів не стандартизовано, тому можливе використання будь-якого з цих двох.
Недоліки
Узагальнити
Перспектива
Uuencoding кодує кожні три байти вхідного файлу чотирма і додає теги початку та кінця, ім'я файлу і розділювачі. У порівнянні з первинним файлом це додає не менше, ніж 33 % додаткових витрат, які, втім, можуть бути компенсовані стисненням файлу перед кодуванням.
Формат UUE походить з тих часів, коли не було формального визначення листа електронної пошти з підтримкою мультимедійних форматів. В більшості поштових клієнтів закодований бінарний файл виглядає як шматок «комп'ютерної абракадабри» в тексті повідомлення. На відміну від цього, у листі формату MIME всі вкладення[en] будуть відділені від тексту повідомлення, у більшості графічних клієнтів — з інтерактивними іконками для перегляду, зберігання та інших маніпуляцій з вкладеннями. MIME забезпечує підтримку різних типів вкладень та наборів символів.
Незважаючи на обмежений набір символів, uuencode-дані іноді спотворюються при проходженні через деякі комп'ютери, які використовують не ASCII (наприклад, EBCDIC). Однією зі спроб виправити ситуацію був формат Xxencode[en], який використовує лише алфавітно-цифрові дані та символи «плюс» і «мінус». Найбільше поширення отримав формат Base64, який також базується на концепції кодування лише алфавітно-цифровими символами на відміну від ASCII-діапазону 32–95, який включає пробіл та різноманітні символи пунктуації. Всі три формати використовують 6 бітів (64 різних символи) для кодування вхідних даних.
Іншою альтернативою є формат Ascii85, який кодує чотири двійкові байти п'ятьма ASCII-символами. Ascii85 застосовується для кодування даних у форматах PostScript та PDF.
Remove ads
Підтримка в 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 [Архівовано 3 березня 2016 у Wayback Machine.] в POSIX.1-2008
- UUENCODE-UUDECODE [Архівовано 14 лютого 2016 у Wayback Machine.] — вільний онлайновий конвертор
- GNU-sharutils [Архівовано 1 березня 2016 у Wayback Machine.] — open source набір утиліт shar/unshar/uuencode/uudecode для GNU Linux
- UUDeview [Архівовано 21 січня 2016 у Wayback Machine.] — open-source програма для кодування/декодування Base64, BinHex, uuencode, xxencode і т. д. для Unix/Windows/DOS
- StUU [Архівовано 22 січня 2016 у Wayback Machine.] — Open Source UUDecoder для Macintosh
Remove ads
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads