UUE
UUE (от англ. Uuencode) — метод представления двоичных данных в текстовой форме, пригодной для их передачи такими средствами, которые первоначально предназначалися только для передачи текстов (например, через e-mail, FTN, NNTP). Является одной из форм транспортного кодирования.
Аббревиатура происходит от расшифровки названия программ uuencode/uudecode: Unix-To-Unix encoding (decoding).
Со временем UUE в Интернете (e-mail, NNTP) уступил место другому методу транспортного кодирования — MIME. В Фидонете метод UUE, напротив, до сих пор пользуется популярностью.
Юю́ки — жаргонное наименование UUE-кодов в Фидонете.
Процесс кодированияПравить
UUE-коды начинаются со строки-заголовка begin mode file
, где mode
— Unix-права доступа к файлу, записанные в восьмеричной системе счисления (для приложений DOS и Windows это число всегда равно 644), а file
— имя исходного файла.
При кодировании из файла берутся данные по три байта (в том случае, если осталось меньше трёх байтов, недостающие заменяются нулями). 24 бита, образующие эти три байта, делятся на четыре группы по 6 битов. Каждая шестибитная группа интерпретируется как число (от 0 до 26 - 1 = 63 включительно), к которому добавляется 32. Получившееся число (всегда в диапазоне от 32 до 95) трактуется как код символа в ASCII-таблице — в итоге получаются символы от пробела (код 32) до знака подчёркивания (код 95).
Каждая группа из 60 символов (соответствует 45 байтам исходного файла) используется для создания отдельной строки «текста». В начале такой строки отдельным символом указывается количество закодированных байтов в строке (во всех строках, кроме последней, это будет число 45, то есть символ «M»). Каждая такая строка завершается символом перевода строки, то есть символом CR и (или) LF, в зависимости от платформы (операционной системы, формата текста, и т. п.).
После окончания данных кодируемого файла помещается строка, содержащая единственный пробел (и перевод строки за ним) — пробел (соответствующий группе нулевых битов) означает, что в этой строке закодировано ноль байтов.
Затем идёт строка с текстом «end».
Употребление строчных букв вместо заглавныхПравить
Для представления шестибитных групп могут использоваться и другие символы ASCII, если у них те же младшие шесть битов кода символа (только эти младшие биты имеют значение при декодировании байтов из «текста»). Это обстоятельство позволяет, например, использовать строчные латинские буквы вместо заглавных (в силу свойств кодировки ASCII изменение регистра символа не меняет его младшие шесть битов).
Употребление обратной кавычки вместо пробелаПравить
Обратная кавычка («`») в таблице ASCII имеет код 96, поэтому младшие шесть битов этого кода — такие же, как у пробела, и соответствуют (после вычитания 32) нулевому байту.
Это обстоятельство способствуют употреблению обратной кавычки вместо пробела в следующих случаях:
- Если «текст» UUE-кодов передаётся таким образом, что передающая его программа (например, почтовая программа) удаляет один или несколько последних пробелов в каждой строке (с целью экономии места — и это бывает полезно в случае обычного текста, но вредоносно для UUE-кодов), тогда после каждой строки UUE-кода дополнительно ставится символ «`», который оказывается в строке последним — и предотвращает удаление предшествующих ему пробелов. (Впоследствии UUE-декодировщик игнорирует этот символ «`», поскольку первый символ строки указывает, сколько байтов на самом деле закодировано в строке.)
- Если «текст» UUE-кодов передаётся таким образом, что передающая его программа (например, почтовая программа) способна манипулировать пробелами (например, добавлять и удалять пробелы во имя красивого форматирования текста — бывает полезно в случае обычного текста, но вредоносно для UUE-кодов), тогда каждый пробел UUE-кода перед отправкою заменяют на символ «`», и тем предотвращают искажение.
Многие UUE-кодировщики вообще всегда ставят группе из шести нулевых битов в соответствие именно символ «`», а не пробел: они действуют по принципу «бережёного Бог бережёт».
Пример UUE-кодированияПравить
Пример кодирования английского слова 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 | ||||||||||||||||||||
Символы UUE | 0
|
V
|
%
|
T
|
Итоговый результат (закодировано слово Cat):
begin 644 cat.txt #0V%T ` end
Таблица символов, используемых при UUE-кодированииПравить
Символ | Десятичный ASCII-код |
Соответствующий двоичный код (после вычитания 32) |
Символ | Десятичный ASCII-код |
Соответствующий двоичный код (после вычитания 32) | |
---|---|---|---|---|---|---|
(пробел) | 32 | 000 000 | @ | 64 | 100 000 | |
! | 33 | 000 001 | A | 65 | 100 001 | |
" | 34 | 000 010 | B | 66 | 100 010 | |
# | 35 | 000 011 | C | 67 | 100 011 | |
$ | 36 | 000 100 | D | 68 | 100 100 | |
% | 37 | 000 101 | E | 69 | 100 101 | |
& | 38 | 000 110 | F | 70 | 100 110 | |
' | 39 | 000 111 | G | 71 | 100 111 | |
( | 40 | 001 000 | H | 72 | 101 000 | |
) | 41 | 001 001 | I | 73 | 101 001 | |
* | 42 | 001 010 | J | 74 | 101 010 | |
+ | 43 | 001 011 | K | 75 | 101 011 | |
, | 44 | 001 100 | L | 76 | 101 100 | |
- | 45 | 001 101 | M | 77 | 101 101 | |
. | 46 | 001 110 | N | 78 | 101 110 | |
/ | 47 | 001 111 | O | 79 | 101 111 | |
0 | 48 | 010 000 | P | 80 | 110 000 | |
1 | 49 | 010 001 | Q | 81 | 110 001 | |
2 | 50 | 010 010 | R | 82 | 110 010 | |
3 | 51 | 010 011 | S | 83 | 110 011 | |
4 | 52 | 010 100 | T | 84 | 110 100 | |
5 | 53 | 010 101 | U | 85 | 110 101 | |
6 | 54 | 010 110 | V | 86 | 110 110 | |
7 | 55 | 010 111 | W | 87 | 110 111 | |
8 | 56 | 011 000 | X | 88 | 111 000 | |
9 | 57 | 011 001 | Y | 89 | 111 001 | |
: | 58 | 011 010 | Z | 90 | 111 010 | |
; | 59 | 011 011 | [ | 91 | 111 011 | |
< | 60 | 011 100 | \ | 92 | 111 100 | |
= | 61 | 011 101 | ] | 93 | 111 101 | |
> | 62 | 011 110 | ^ | 94 | 111 110 | |
? | 63 | 011 111 | _ | 95 | 111 111 | |
` | 96 | (1) 000 000 |
НедостаткиПравить
- За счёт использования только шести битов из восьми, потери информационной плотности при кодировании в UUE составляют одну треть (файл размером 1000 килобайтов займёт 1333 килобайта в UUE).
- Несмотря на узкий диапазон используемых символов, возникают проблемы при передаче UUE через очень старые компьютеры, не использующие ASCII-кодировку (например, EBCDIC).
Особенности использования UUE в ФидонетеПравить
Для передачи двоичных данных в Фидонете UUE является стандартом de facto. Это обстоятельство объясняется тем, что некоторые узлы отказывались передавать «приложенные» к письмам файлы (фидопочту с флагом Att), что обеспечило UUE популярность в качестве альтернативы. В рамках дальнейших средств борьбы с передачей двоичных данных через текстовую сеть на некоторых узлах стремились настраивать мейлеры и тоссеры на отказ в передаче и тех сообщений, которые содержат UUE.[1]
Для обеспечения совместимости со старым программным обеспечением[2] размер письма во многих эхоконференциях Фидонета примерно до 2004 или 2005 года ограничивался величиною, достаточною для среднего письма, но недостаточною для передачи любого сколько-нибудь объёмистого файла — например, 32 килобайтами. С учётом служебной информации, добавляемой при распространении почты по Фидонету, письму не рекомендовалось превосходить размер 500 строк. Ююки такого размера соответствуют примерно 22 килобайтам исходного файла. Файлы большего размера приходится передавать в нескольких последовательных письмах, каждое из которых содержит одну секцию UUE-кода. При этом в заголовке письма обычно указывается порядковый номер секции, а также общее число секций (например, [6/55]
, где 6 — номер текущей секции, а 55 — общее число секций). Начальный номер секции различается в зависимости от используемого программного обеспечения (0 или 1).
В эхоконференциях возможность использовать UUE регулируется правилами конференции; согласно требованию эхополиси R50, для принятия конференции на региональный бон в её правилах должно быть прописано ограничение на помещение UUE.[3] Однако существует множество небонных (то есть не находящихся на региональном эхобоне) конференций, специализирующихся именно на передаче UUE-кодов.
Самовольное помещение UUE большого объёма расценивается как XAB. Существует прецедент срочной экскоммуникации узла 2:5030/950 за помещение пользователем узла в конференцию SU.KASHENKO.LOCAL около 16 мегабайтов MP3-файлов в формате UUE.
UUE-кодекиПравить
Общего назначенияПравить
- uuencode — кодировщик, uudecode — декодировщик
ФидонетовскиеПравить
- Почтовый редактор GoldED изначально поддерживал кодирование и декодирование только односекционных UUE. В редакторе GoldED+ также обеспечивается декодирование многосекционных UUE-кодов.
- Заслуженной популярностью в Фидонете пользуется программа FastUUE Сергея Коровкина, способная публиковать и собирать не только двоичные (UUE), но и текстовые секции.
- hpucode из состава проекта Husky.
ПримечанияПравить
- ↑ Впрочем, фактическое наложение такого запрета является технически нетривиальной задачей, неизменно сталкивающейся с проблемою распознавания нестандартных UUE-кодов — например, многосекционных, или содержащих менее или более 60 символов (45 байтов исходного файла) на одну строку UUE-кода, или вообще с переменною длиною строк.
- ↑ Основные ограничения вызваны распространённостью 16-битного программного обеспечения, предназначенного для DOS — например, тоссера FastEcho. Размер одного сегмента памяти, адресуемого такими программами, составляет 64 килобайта, то есть 216 байтов.
- ↑ Вторая (действующая) версия эхополиси гласит: «Пересылка двоичных файлов в форматах UUENCODE, MIME и т. д. должна регламентироваться правилами конкретной эхоконференции, но в общем случае следует стремиться к снижению такого трафика — например, запретом помещения в конференцию двоичной информации без явного разрешения (ко)модератора».