WikiDer > 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 числовая цифра:
- Начать с 3 байты из источника, 24 биты в итоге.
- Разделить на 4 6-кусочек группировки, каждая из которых представляет значение в диапазоне от 0 до 63: биты (00-05), (06-11), (12-17) и (18-23).
- Добавьте 32 к каждому из значений. С добавлением 32 это означает, что возможные результаты могут быть между 32 ("" Космос) и 95 ("_" подчеркивать). 96 ("`" серьезный акцент) как «специальный символ» является логическим продолжением этого диапазона.
- Выведите эквивалент этих чисел в формате ASCII.
Если исходная длина не делится на 3, то последний 4-байтовый раздел будет содержать набивка байтов, чтобы сделать его полностью делимым. Эти байты вычитаются из строки <length character> чтобы декодер не добавлял в файл нежелательные символы.
uudecoding является обратным вышеуказанному, вычтите 32 из кода ASCII каждого символа, чтобы получить 6-битное значение, объедините 4 6-битные группы, чтобы получить 24 бита, а затем выведите 3 байта.
Процесс кодирования демонстрируется этой таблицей, в которой показано происхождение вышеуказанного кодирования для «Cat».
Оригинальные персонажи | C | а | т | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Исходный код 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 | % | Т |
таблица 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 | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | 32 | SP | 10 | 42 | * | 20 | 52 | 4 | 30 | 62 | > | 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 | & | 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 | < | 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).
- файл
Имя файла = 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} |. +) //) ; 'Кот
Смотрите также
- Двоичное кодирование текста для сравнения различных алгоритмов кодирования
Рекомендации
- ^ Хортон, Марк. "Руководство программиста UUENCODE (1C) UNIX". www.tuhs.org. Получено 2020-11-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 с открытым исходным кодом для декодирования uuencoded (почтовых) вложений