Uuencode и uudecode

Кодируйте текст, шестнадцатеричные байты или файлы в классическом формате Unix-to-Unix или декодируйте блоки uuencode из старых писем, архивов Usenet и скриптов обратно в исходные данные.

Работает полностью в браузере. Данные никуда не загружаются.

Как пользоваться

  1. Выберите «Кодировать», чтобы создать блок uuencode, или «Декодировать», чтобы извлечь из него данные.
  2. Оставьте параметр «Строки begin / end» включённым и укажите «Имя файла», если результат должен работать с командой uudecode. Отключите его, чтобы получить только строки данных.
  3. Введите или вставьте исходные данные либо откройте файл, чтобы закодировать его байты.
  4. При декодировании вставьте блок целиком, включая строку 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.isbegin 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, и наоборот.