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>, тому декодер не додасть до файлу небажані нуль-символи[en].

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 всі вкладення[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
$

Посилання

[ред. | ред. код]