Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

UUencoding является формой кодирования двоичной в текст , который возник в Unix программ UUencode и uudecode написана Мэри Энн Хортон Калифорнийского университета в Беркли в 1980 году [1] для кодирующая двоичных данных для передачи в системах электронной почты.

Название «uuencoding» происходит от «кодирования Unix-to-Unix», т. Е. Идеи использования безопасного кодирования для передачи файлов Unix из одной системы Unix в другую систему Unix, но без гарантии, что все промежуточные ссылки будут системами Unix. Поскольку сообщение электронной почты может быть переадресовано через или на компьютеры с разными наборами символов или через транспорты, которые не являются 8-битными чистыми , или обрабатываются программами, которые не являются 8-битными чистыми , пересылка двоичного файла по электронной почте может привести к его повреждению. . При кодировании таких данных в подмножество символов, общее для большинства наборов символов, закодированная форма таких файлов данных вряд ли будет «преобразована» или повреждена и, таким образом, будет доставлена ​​в место назначения без изменений и без изменений.отменяет действие uuencode , точно воссоздавая исходный двоичный файл. uuencode / decode стал популярным для отправки двоичных (и особенно сжатых) файлов по электронной почте и публикации в группах новостей Usenet и т. д.

Сейчас он в значительной степени заменен на MIME и yEnc . При использовании MIME файлы, которые могли быть закодированы uuencoded, вместо этого передаются с кодировкой base64 .

Закодированный формат [ править ]

Файл с кодировкой uuencoded начинается со строки заголовка в форме:

begin <режим> <файл> <новая строка>

<режим> - это права доступа к файлу Unix в виде трех восьмеричных цифр (например, 644, 744). Обычно это важно только для unix-подобных операционных систем.

<файл> - это имя файла, которое будет использоваться при воссоздании двоичных данных.

<новая строка > обозначает символ новой строки , используемый для завершения каждой строки.

Каждая строка данных использует формат:

<длина символа> <форматированные символы> <новая строка>

<символ длины> - это символ, указывающий количество байтов данных, которые были закодированы в этой строке. Это символ ASCII, определяемый добавлением 32 к фактическому счетчику байтов, за единственным исключением серьезного акцента "" "(код ASCII 96), обозначающего ноль байтов. Все строки данных, кроме последней (если длина данных не делится на 45), содержат 45 байтов закодированных данных (60 символов после кодирования). Следовательно, подавляющее большинство значений длины - «M» (32 + 45 = код ASCII 77 или «M»).

<форматированные символы> - это закодированные символы. См. «Механизм форматирования» для получения более подробной информации о фактической реализации.

Файл заканчивается двумя строчками:

`<новая строка>конец <новая строка>

Предпоследняя строка также представляет собой символ, обозначающий длину строки, с серьезным ударением, обозначающим ноль байтов.

В качестве полного файла вывод uuencoded для простого текстового файла с именем cat.txt, содержащего только символы Cat , будет

начать 644 cat.txt# 0V% T`конец

Начальная строка - это стандартный заголовок uuencode; '#' указывает, что его строка кодирует три символа; последние две строки появляются в конце всех файлов с кодировкой uuencoded.

Механизм форматирования [ править ]

Механизм uuencoding повторяет следующее для каждых 3 байтов, кодируя их в 4 печатаемых символа, каждый символ представляет собой числовую цифру с основанием 64 :

  1. Начните с 3 байтов от источника, всего 24 бита .
  2. Разделены на 4 группы по 6 бит , каждая из которых представляет значение в диапазоне от 0 до 63: биты (00-05), (06-11), (12-17) и (18-23).
  3. Добавьте 32 к каждому из значений. С добавлением 32 это означает, что возможные результаты могут быть от 32 ( пробел "" ) до 95 ( подчеркивание "_" ). 96 (« серьезный ударение» ) в качестве «особого символа» является логическим продолжением этого диапазона.
  4. Выведите эквивалент этих чисел в формате ASCII.

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

uudecoding является обратным вышеописанному: вычтите 32 из кода ASCII каждого символа, чтобы получить 6-битное значение, объедините 4 6-битные группы, чтобы получить 24 бита, а затем выведите 3 байта.

Процесс кодирования демонстрируется этой таблицей, которая показывает происхождение вышеуказанного кодирования для «Cat».

таблица uuencode [ править ]

В следующей таблице показано преобразование десятичного значения 6-битных полей, полученных в процессе преобразования, и соответствующий им выходной код и символ ASCII .

Обратите внимание, что 96 ("" " серьезный ударение ) - это символ, который встречается в файлах с кодировкой uu, но обычно используется только для обозначения строки нулевой длины, обычно в конце файла. Это никогда не произойдет естественным образом в фактических преобразованных данных, поскольку оно находится за пределами диапазона от 32 до 95. Единственным исключением является то, что некоторые программы uuencoding используют серьезный ударение для обозначения байтов заполнения вместо пробела. Однако символ, используемый для байта заполнения, не стандартизирован, поэтому возможен любой из них.

Пример [ править ]

Ниже приведен пример uuencoding однострочного текстового файла. В этом примере % 0D - это байтовое представление для возврата каретки (CR), а % 0A - байтовое представление для перевода строки (LF).

файл
Имя файла = wikipedia-url.txtСодержимое файла = http: //www.wikipedia.org%0D%0A
uuencoding
начать 644 wikipedia-url.txt:: '1T <# HO + W = W = RYW: 6MI <& 5D: 6 $ N; W) G # 0H``конец

Вилки (файл, ресурс) [ править ]

У Unix традиционно есть единственная ветвь, в которой хранятся данные файлов. Однако некоторые файловые системы поддерживают несколько вилок, связанных с одним файлом. Например, классическая Mac OS HFS поддерживала вилку данных и вилку ресурсов . Mac OS HFS + поддерживает несколько разветвлений, как и альтернативные потоки данных Microsoft Windows NTFS . Большинство инструментов uucoding обрабатывают данные только из первичного ответвления данных, что может привести к потере информации при кодировании / декодировании (например, комментарии файлов Windows NTFS хранятся в другом ответвлении ). Некоторые инструменты (например, классическое приложение Mac OS UUTool) решил проблему, объединив разные вилки в один файл и дифференцируя их по имени файла.

Отношение к xxencode, Base64 и Ascii85 [ править ]

Несмотря на ограниченный диапазон символов, uuencoded данные иногда повреждаются при прохождении через определенные компьютеры с использованием наборов символов, отличных от ASCII, таких как EBCDIC . Одной из попыток решить проблему был формат xxencode, в котором использовались только буквенно-цифровые символы, а также символы плюс и минус. Сегодня более распространен формат Base64, который основан на той же концепции только буквенно-цифровых символов, в отличие от ASCII 32–95. Все три формата используют 6 бит (64 различных символа) для представления своих входных данных.

Base64 также может быть сгенерирован программой uuencode и аналогичен по формату, за исключением фактического преобразования символов:

Заголовок изменен на

begin-base64 <режим> <файл>

трейлер становится

====

и строки между ними кодируются символами, выбранными из

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /

Другой альтернативой является Ascii85 , который кодирует четыре двоичных символа пятью символами ASCII. Ascii85 используется в форматах PostScript и PDF .

Недостатки [ править ]

uuencoding берет 3 предварительно отформатированных байта и превращает их в 4, а также добавляет начальные / конечные теги, имя файла и разделители . Это добавляет как минимум 33% накладных расходов на данные по сравнению с исходным кодом, хотя это можно, по крайней мере, в некоторой степени компенсировать путем сжатия файла перед его кодированием.

Поддержка в Python [ править ]

Язык Python поддерживает uuencoding с использованием модуля кодеков с кодеком «uu»:

Для Python 2 (не рекомендуется / прекращено с 1 января 2020 г.) :

$ python -c 'print "Cat" .encode ("uu")' begin 666 <data> # 0V% T end$

Для Python 3, где модуль кодеков необходимо импортировать и использовать напрямую :

$ python3 -c "из кодеков import encode; print (encode (b'Cat ',' uu '))" b'begin 666 <data> \ n # 0V% T \ n \ nend \ n' $

Поддержка в Perl [ править ]

Язык Perl изначально поддерживает uuencoding с помощью операторов pack () и unpack () со строкой формата «u»:

$ perl -e 'print pack ("u", "Cat")' # 0V% T

Расшифровка base64 с помощью unpack также может быть выполнена путем перевода символов:

$ perl -e ' $ a = "Q2F0" ;  $ a = ~ tr # A-Za-z0-9 + / \. \ _ ## cd; # удалить символы, отличные от base64 > $ a = ~ tr # A-Za-z0-9 + / # -_ #; # translate sets > print unpack ("u", pack ("C", 32 + int (length ($ 1) * 6/8)). $ 1) while ($ a = ~ s / (. {60} |. + ) //); ' Кот

См. Также [ править ]

  • Двоичное кодирование текста для сравнения различных алгоритмов кодирования

Ссылки [ править ]

  1. ^ Хортон, Марк. "Руководство программиста UUENCODE (1C) UNIX" . www.tuhs.org . Проверено 10 ноября 2020 .

Внешние ссылки [ править ]

  • Запись uuencode в POSIX.1-2008, http://pubs.opengroup.org/onlinepubs/9699919799/utilities/uuencode.html
  • GNU-sharutils - набор утилит shar / unshar / uuencode / uudecode с открытым исходным кодом, используемых в GNU / Linux
  • UUDeview - программа с открытым исходным кодом для кодирования / декодирования Base64, BinHex, uuencode, xxencode и т. Д. Для Unix / Windows / DOS
  • UUENCODE-UUDECODE - программа с открытым исходным кодом для кодирования / декодирования, созданная Клемом "Дедушка" Красителем.
  • StUU - быстрый UUDecoder с открытым исходным кодом для Macintosh от Стюарта Чешира
  • UUENCODE-UUDECODE - Бесплатный онлайн-код UUEncoder и UUDecoder
  • Java UUDecoder - библиотека Java с открытым исходным кодом для декодирования вложений, закодированных в uuencoder (почта)