uuencoding

редактировать

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

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

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

СОДЕРЖАНИЕ

  • 1 закодированный формат
  • 2 Механизм форматирования
  • 3 uuencode таблица
  • 4 Пример
  • 5 вилок (файл, ресурс)
  • 6 Отношение к xxencode, Base64 и Ascii85
  • 7 Недостатки
  • 8 Поддержка в Python
  • 9 Поддержка в Perl
  • 10 См. Также
  • 11 Источники
  • 12 Внешние ссылки

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

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

begin lt;modegt; lt;filegt;lt;newlinegt;

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

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

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

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

lt;length charactergt;lt;formatted charactersgt;lt;newlinegt;

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

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

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

`lt;newlinegt; endlt;newlinegt;

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

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

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 (« серьезный ударение» ) в качестве «особого символа» является логическим продолжением этого диапазона. Несмотря на то, что символ пробела задокументирован как кодировка для значения 0, реализации, такие как GNU sharutils, фактически используют символ серьезного акцента для кодирования нулей в теле файла, никогда не используя пробел.
  4. Выведите эквивалент этих чисел в формате ASCII.

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

uudecoding является обратным вышеупомянутому, вычтите 32 из кода ASCII каждого символа ( по модулю 64 для учета использования серьезного акцента ), чтобы получить 6-битное значение, объедините 4 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
Uu закодированные символы 0 V % T

таблица uuencode

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

Обратите внимание, что некоторые кодеры могут выдавать пробел (код 32) вместо серьезного акцента («« », код 96), в то время как некоторые декодеры могут отказываться декодировать данные, содержащие пробел.

шесть бит Код ASCII ASCII символ шесть бит Код ASCII ASCII символ шесть бит Код ASCII ASCII символ шесть бит Код ASCII ASCII символ шесть бит Код ASCII ASCII символ шесть бит Код ASCII ASCII символ шесть бит Код ASCII ASCII символ
00 96 ` 10 42 * 20 52 4 30 62 gt; 40 72 ЧАС 50 82 р 60 92 \
01 33 ! 11 43 год + 21 год 53 5 31 год 63 ? 41 год 73 я 51 83 S 61 93 ]
02 34 " 12 44 , 22 54 6 32 64 @ 42 74 J 52 84 Т 62 94 ^
03 35 год # 13 45 - 23 55 7 33 65 А 43 год 75 K 53 85 U 63 95 _
04 36 $ 14 46 . 24 56 8 34 66 B 44 76 L 54 86 V
05 37 % 15 47 / 25 57 9 35 год 67 C 45 77 M 55 87 W
06 38 amp; 16 48 0 26 год 58 : 36 68 D 46 78 N 56 88 Икс
07 39 ' 17 49 1 27 59 ; 37 69 E 47 79 О 57 89 Y
08 40 ( 18 50 2 28 год 60 lt; 38 70 F 48 80 п 58 90 Z
09 41 год ) 19 51 3 29 61 знак равно 39 71 грамм 49 81 год Q 59 91 [

Пример

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

файл
File Name = wikipedia-url.txt File Contents = http://www.wikipedia.org%0D%0A
uuencoding
begin 644 wikipedia-url.txt::'1Tlt;#HO+W=W=RYW:6MIlt;amp;5D:6$N;W)G#0H` ` end

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

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

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

Основные статьи: xxencoding, Base64 и Ascii85

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

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

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

begin-base64 lt;modegt; lt;filegt;

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

====

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

ABCDEFGHIJKLMNOP QRSTUVWXYZabcdef ghijklmnopqrstuv wxyz0123456789+/

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

Недостатки

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

Поддержка в Python

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

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

$ python -c 'print "Cat".encode("uu")' begin 666 lt;datagt; #0V%T end $

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

$ python3 -c "from codecs import encode;print(encode(b'Cat', 'uu'))" b'begin 666 lt;datagt;\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; # remove non-base64 chars gt; $a=~tr#A-Za-z0-9+/# -_#; # translate sets gt; print unpack("u",pack("C",32+int(length($1)*6 / 8)). $1) while($a=~s/(.{60}|.+)//);' Cat

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

использованная литература

внешние ссылки

  • Запись uuencode в POSIX.1-2008, http://pubs.opengroup.org/onlinepubs/9699919799/utilities/uuencode.html
  • GNU-sharutils - набор утилит shar / unshar / uuencode / uudecode с открытым исходным кодом
  • UUDeview - программа с открытым исходным кодом для кодирования / декодирования Base64, BinHex, uuencode, xxencode и т. Д. Для Unix / Windows / DOS
  • UUENCODE-UUDECODE - программа с открытым исходным кодом для кодирования / декодирования, созданная Клемом "Дедушка" Красителем.
  • StUU - быстрый UUDecoder с открытым исходным кодом для Macintosh от Стюарта Чешира
  • UUENCODE-UUDECODE - Бесплатный онлайн-код UUEncoder и UUDecoder
  • Java UUDecoder - Java-библиотека с открытым исходным кодом для декодирования uuencoded (почтовых) вложений
  • AN11229 - Примечание по применению NXP: кодирование UU для UART ISP
Последняя правка сделана 2024-01-06 05:19:01
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте