uuкодирование
uuencoding — это форма кодирования двоичного кода в текст , которая возникла в Unix программах uuencode и uudecode, написанных Мэри Энн Хортон в Калифорнийском университете в Беркли в 1980 году. [1] для кодирования двоичных данных для передачи в системах электронной почты .
Название «uuencoding» происходит от Unix-to-Unix Copy , т.е. «Unix-to-Unix-кодирование» — это безопасное кодирование для передачи произвольных файлов из одной системы Unix в другую систему Unix, но без гарантии, что промежуточные ссылки будут все это системы Unix. Поскольку сообщение электронной почты может пересылаться через или на компьютеры с другими наборами символов или через транспорты, которые не являются 8-битными , или обрабатываться программами, которые не являются 8-битными, пересылка двоичного файла по электронной почте может привести к его повреждению. . За счет кодирования таких данных в подмножество символов, общее для большинства наборов символов, закодированная форма таких файлов данных вряд ли будет «переведена» или повреждена и, таким образом, будет доставлена в пункт назначения в целости и сохранности. Программа uudecode отменяет эффект uuencode , точно воссоздавая исходный двоичный файл. uuencode/decode стал популярен для отправки двоичных (и особенно сжатых) файлов по электронной почте, публикации в Usenet группах новостей и т. д.
Сейчас он в значительной степени заменен MIME и yEnc . При использовании MIME файлы, которые могли быть закодированы uu, вместо этого передаются в кодировке Base64 .
Закодированный формат
[ редактировать ]Файл в кодировке uu начинается со строки заголовка вида:
begin <mode> <file><newline>
<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>
являются закодированными символами. См. § Механизм форматирования для получения более подробной информации о фактической реализации.
Файл заканчивается двумя строками:
`<newline> end<newline>
Предпоследняя строка также является символом, обозначающим длину строки, с акцентом, обозначающим нулевые байты.
В качестве полного файла вывод в кодировке uu для обычного текстового файла с именем cat.txt, содержащего только символы Cat , будет выглядеть так:
begin 644 cat.txt #0V%T ` end
Начальная строка представляет собой стандартный заголовок uuencode; '#' указывает, что его строка кодирует три символа; последние две строки появляются в конце всех файлов, закодированных uu.
Механизм форматирования
[ редактировать ]Механизм uuencoding
повторяет следующее для каждых 3 байтов, кодируя их в 4 печатных символа, каждый символ представляет по основанию 64 числовую цифру :
- Начните с 3 байтов исходного кода, 24 бита . всего
- Разделено на 4 6-битные группы, каждая из которых представляет значение в диапазоне от 0 до 63: биты (00–05), (06–11), (12–17) и (18–23).
- Добавьте 32 к каждому из значений. При добавлении 32 это означает, что возможные результаты могут находиться в диапазоне от 32 ("" пробел) до 95 ("_" подчеркивание ). 96 («`» серьезное ударение ) как «специальный символ» является логическим расширением этого диапазона. Несмотря на то, что символ пробела задокументирован как кодировка значения 0, реализации, такие как GNU sharutils, [2] на самом деле используйте символ серьезного акцента для кодирования нулей в теле файла, никогда не используя пробел.
- Выведите ASCII-эквивалент этих чисел.
Если исходная длина не делится на 3, то последний 4-байтовый раздел будет содержать байты заполнения, чтобы сделать его делимым без ошибок. Эти байты вычитаются из строки <length character>
чтобы декодер не добавлял в файл нежелательные символы.
uudecoding
это обратное вышеописанному: вычтите 32 из ASCII-кода каждого символа ( по модулю 64 для учета использования серьезного акцента), чтобы получить 6-битное значение, объедините 4 6-битные группы, чтобы получить 24 бита, затем выведите 3 байта.
Процесс кодирования демонстрируется в этой таблице, в которой показано получение вышеуказанной кодировки для «Кошка».
Оригинальные персонажи | 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-код голец | |||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | 96 | ` |
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 | _
|
Пример
[ редактировать ]Ниже приведен пример кодирования uu однострочного текстового файла. В этом примере %0D — это байтовое представление возврата каретки , а %0A — байтовое представление перевода строки .
- файл
File Name = wikipedia-url.txt File Contents = http://www.wikipedia.org%0D%0A
- uuкодирование
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 <mode> <file>
трейлер становится
====
а строки между ними кодируются символами, выбранными из
ABCDEFGHIJKLMNOP QRSTUVWXYZabcdef ghijklmnopqrstuv wxyz0123456789+/
Другой альтернативой является Ascii85 , который кодирует четыре двоичных символа пятью символами ASCII. Ascii85 используется в форматах PostScript и PDF .
Недостатки
[ редактировать ]uuencoding принимает 3 предварительно отформатированных байта и превращает их в 4, а также добавляет начальные/конечные теги, имя файла и разделители . Это добавляет как минимум 33% накладных расходов на данные по сравнению с одним только исходным кодом, хотя это можно, по крайней мере, в некоторой степени компенсировать, сжимая файл перед его кодированием.
Поддержка на языках
[ редактировать ]Питон
[ редактировать ]Язык Python поддерживает кодирование uu с помощью модуля codecs с кодеком «uu»:
Для Python 2 (устарело/прекращено с 1 января 2020 г.) :
$ python -c 'print "Cat".encode("uu")'
begin 666 <data>
#0V%T
end
$
Для Python 3 , где модуль кодеков необходимо импортировать и использовать напрямую :
$ python3 -c "from codecs import encode;print(encode(b'Cat', 'uu'))"
b'begin 666 <data>\n#0V%T\n \nend\n'
$
Для декодирования передайте весь файл:
$ python3 -c "from codecs import decode;print(decode(b'begin 666 <data>\n#0V%T\n \nend\n', 'uu'))"
b'Cat'
Перл
[ редактировать ]Язык Perl изначально поддерживает кодирование uu с использованием операторов package() и unpack() со строкой формата «u»:
$ perl -e 'print pack("u","Cat")'
#0V%T
Декодирование base64 с помощью unpack также можно выполнить путем перевода символов:
$ perl -e 'print unpack("u","#0V%T")'
Cat
Чтобы создавать правильно сформированные файлы в кодировке uu, вам необходимо использовать модули, [3] или еще немного кода: [4]
Кодировать (однострочное)
[ редактировать ]$ perl -ple 'BEGIN{use File::Basename;$/=undef;$sn=basename($ARGV[0]);} $_= "begin 600 $sn\n".(pack "u", $_)."`\nend" if $_' /some/file/to_encode.gz
Кодирование/декодирование (правильные сценарии Perl)
[ редактировать ]https://metacpan.org/dist/PerlPowerTools/view/bin/uuencode
https://metacpan.org/dist/PerlPowerTools/view/bin/uudecode
См. также
[ редактировать ]- Кодирование двоичного текста в текст для сравнения различных алгоритмов кодирования.
Ссылки
[ редактировать ]- ^ Хортон, Марк. «UUENCODE(1C) Руководство программиста UNIX» . Общество наследия Unix . Проверено 10 ноября 2020 г.
- ^ «Источник uuencode.c» . fossies.org . Проверено 5 июня 2021 г.
- ^ «Исходный код PerlPowerTools» . Metacpan.org . Проверено 12 февраля 2024 г.
- ^ «Исходный код uuencode.pl» . main.linuxfocus.org . Проверено 12 февраля 2024 г.
Внешние ссылки
[ редактировать ] в этом разделе Использование внешних ссылок может не соответствовать политике и рекомендациям Википедии . ( Март 2020 г. ) |
- uuencode запись в POSIX.1-2008
- 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: UUencoding для UART ISP