Как пользоваться
- Выберите «Кодировать», чтобы создать блок uuencode, или «Декодировать», чтобы извлечь из него данные.
- Оставьте параметр «Строки begin / end» включённым и укажите «Имя файла», если результат должен работать с командой uudecode. Отключите его, чтобы получить только строки данных.
- Введите или вставьте исходные данные либо откройте файл, чтобы закодировать его байты.
- При декодировании вставьте блок целиком, включая строку begin, если она есть, затем скопируйте результат или скачайте его в виде файла.
Что такое uuencode?
Uuencode (сокращение от Unix-to-Unix encode) появился около 1980 года, когда файлы копировали между Unix-машинами по каналам UUCP, передававшим только текст. Он превращает каждые 3 байта в четыре 6-битных значения и прибавляет к каждому 32, получая печатные символы от пробела до знака подчёркивания. Почтовые системы часто удаляли пробелы в конце строк, поэтому нулевое значение записывается не пробелом, а обратным апострофом (`) — так поступает и этот инструмент.
Файл в формате uuencode имеет фиксированную структуру:
- Строка заголовка
begin 644 name, где 644 — права доступа к файлу в Unix в восьмеричной записи (владелец может читать и записывать, все остальные — только читать), а name — имя создаваемого файла. - Строки данных, каждая из которых содержит до 45 входных байтов. Каждая начинается с символа длины (32 плюс количество байтов, поэтому полная строка начинается с
M), за которым следуют до 60 закодированных символов. - Строка из одного обратного апострофа, означающая ноль байтов, а затем строка
end.
С учётом символов длины и переводов строк результат примерно на 38% больше исходных данных.
Uuencode сегодня
До появления MIME uuencode был обычным способом отправлять программы и изображения по электронной почте и публиковать их в Usenet. В 1990-х годах его вытеснил MIME Base64: в uuencode нельзя было указать тип содержимого, существовало несколько несовместимых вариантов, а некоторые знаки препинания искажались шлюзами между системами ASCII и EBCDIC — именно поэтому был создан xxencode.
Данные в формате uuencode до сих пор встречаются в архивах почты и новостей, старых shell-скриптах и унаследованных системах. Для новых задач используйте Base64, а для целых файлов — Файл в Base64.
Uuencode в командной строке и в Python
# Командная строка (GNU sharutils): входной файл, затем имя для строки begin
uuencode photo.jpg photo.jpg > photo.uu
uudecode photo.uu
# Python: по одной строке длиной до 45 байт
import binascii
line = binascii.b2a_uu(b'hello', backtick=True)
binascii.a2b_uu(line) # b'hello'
Старый модуль Python uu был удалён в Python 3.13, но функции binascii остались.
Спецификация
| Алфавит | ASCII от 32 до 96 (от пробела до `) |
|---|---|
| Размер результата | Около 137% с учётом префиксов строк |
| Дополнение | Строки до 45 байт |
| Стандарт | POSIX uuencode |
| Учёт регистра | Да |
Примеры
| Исходные данные (UTF-8) | Результат |
|---|---|
Hello, World! | begin 644 data.bin
-2&5L;&\L(%=O<FQD(0``
`
end |
Base64.is | begin 644 data.bin
)0F%S938T+FES
`
end |
你好 | begin 644 data.bin
&Y+V@Y:6]
`
end |
Часто задаваемые вопросы
Почему в тексте uuencode встречаются обратные апострофы?
Нулевое значение соответствовало бы пробелу, а пробелы в конце строк часто терялись при передаче. Многие кодировщики, в том числе этот, записывают вместо него обратный апостроф. Декодер принимает оба варианта.
Что означает begin 644?
Эта строка начинает закодированный блок. 644 — права доступа Unix для восстановленного файла (чтение и запись для владельца, чтение для всех остальных), а слово после них — имя файла, который создаст uudecode. Имя можно задать в параметрах.
Можно ли декодировать uuencode без строки begin?
Да. Если строки begin нет, каждая строка декодируется как данные. Если она есть, декодирование начинается после неё и заканчивается на строке end, поэтому текст вокруг блока, например тело письма, пропускается. Пробелы в конце строк, удалённые почтовыми программами, восстанавливаются автоматически.
Uuencode — это то же самое, что Base64?
Нет. Оба превращают 3 байта в 4 символа, но uuencode использует другой диапазон символов, символ длины в каждой строке и строки begin и end. Результат Base64 нельзя декодировать как uuencode, и наоборот.