Uuencoding - Uuencoding

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

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

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

Кодированный формат

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

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

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

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

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

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

<length character><formatted characters><newline>

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

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

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

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

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

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

begin 644 cat.txt # 0V% T`end

Начальная строка - это стандартный заголовок 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».

Оригинальные персонажиCат
Исходный код ASCII, десятичный6797116
ASCII, двоичный010000110110000101110100
Новые десятичные значения1654552
+3248863784
Uu закодированные символы0V%Т

таблица uuencode

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

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

шесть
биты
ASCII
код
ASCII
char
шесть
биты
ASCII
код
ASCII
char
шесть
биты
ASCII
код
ASCII
char
шесть
биты
ASCII
код
ASCII
char
шесть
биты
ASCII
код
ASCII
char
шесть
биты
ASCII
код
ASCII
char
шесть
биты
ASCII
код
ASCII
char
0032SP 1042* 20524 3062> 4072ЧАС 5082р 6092\
0133! 1143+ 21535 3163? 4173я 5183S 6193]
0234" 1244, 22546 3264@ 4274J 5284Т 6294^
0335# 1345- 23557 3365А 4375K 5385U 6395_
0436$ 1446. 24568 3466B 4476L 5486V
0537% 1547/ 25579 3567C 4577M 5587W
0638& 16480 2658: 3668D 4678N 5688Икс
0739' 17491 2759; 3769E 4779О 5789Y
0840( 18502 2860< 3870F 4880п 5890Z
0941) 19513 2961= 3971грамм 4981Q 5991[

Пример

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

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

Вилки (файл, ресурс)

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

Отношение к xxencode, Base64 и Ascii85

Несмотря на ограниченный диапазон символов, uu-кодированные данные иногда повреждаются при прохождении через определенные компьютеры с использованием наборов символов, отличных от 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 <данные>#0 В% Тконец$

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

$ python3 -c "из кодеков импортировать encode; print (encode (b'Cat ',' uu '))"b'begin 666 <данные>  n # 0V% T  n  nend  n '$

Поддержка в Perl

В Perl язык поддерживает кодирование uuencoding с использованием операторов pack () и unpack () со строкой формата "u":

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

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

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

Смотрите также

Рекомендации

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

внешняя ссылка

  • 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 с открытым исходным кодом для декодирования uuencoded (почтовых) вложений