Как кодировать в uuencode и декодировать uudecode
Чтобы закодировать:
- Введите или вставьте текст в поле Ввод · Текст. Блок uuencode появляется в поле Результат · uuencode.
- Задайте Имя файла под результатом: оно попадёт в строку
begin. По умолчанию этоdata.bin. - Снимите галочку строки begin/end, если нужны только закодированные строки, например чтобы встроить их в другой формат.
Чтобы декодировать:
- Нажмите uuencode → Текст в переключателе направления.
- Вставьте данные в uuencode. Вокруг них может оставаться текст письма или поста из новостей: всё, что стоит до строки
begin, пропускается. - Прочитайте текст в результате или нажмите Сохранить байты, чтобы скачать декодированный файл под именем из строки
begin. Для двоичного содержимого сначала выберите в В формат Hex, чтобы посмотреть, что внутри.
Из чего состоит файл в uuencode
Текст Cat с именем файла hello.txt кодируется так:
begin 644 hello.txt
#0V%T
`
end
begin 644 hello.txtзадаёт права доступа Unix и имя файла.- Каждая строка данных начинается с символа длины: число байтов в строке плюс 32. Код
#равен 35, значит, в строке 3 байта. Полная строка вмещает 45 байтов и начинается сM, за которым идут 60 символов. - Символы данных по сути работают как в Base64: каждые 3 байта превращаются в четыре 6-битных значения, и каждое значение v записывается символом с кодом v + 32. Значение 0 вместо пробела записывается обратной кавычкой.
- Строка с одной обратной кавычкой обозначает пустую строку длины 0, а
endзакрывает блок.
На более длинном вводе видна структура полной строки:
begin 644 fox.txt
M5&AE('%U:6-K(&)R;W=N(&9O>"!J=6UP<R!O=F5R('1H92!L87IY(&1O9RX@
*,#$R,S0U-C<X.0``
`
end
Это The quick brown fox jumps over the lazy dog. 0123456789: 45 байтов в строке M и 10 в строке * (42 − 32 = 10). Каждая строка несёт свою длину плюс перевод строки, поэтому данные в uuencode примерно на 38% больше исходных, чуть больше, чем у Base64.
Где ещё встречается uuencode
uuencode происходит из Unix-to-Unix Copy (UUCP) и до появления MIME был стандартным способом пересылать двоичные файлы по почте и через Usenet. Сегодня он попадается в старых почтовых архивах, постах Usenet, при передаче файлов на некоторых встраиваемых системах и мейнфреймах, а также в скриптах, которые передают файлы в mail через пайп.
Соглашение об обратной кавычке родом из той же эпохи. Некоторые шлюзы обрезали пробелы в конце строк, и данные, где ноль кодировался пробелом, портились; обратная кавычка такое переживает. Этот кодировщик пишет обратные кавычки, а декодер принимает оба варианта.
Uuencode в командной строке и в Python
С установленным GNU sharutils:
uuencode hello.txt hello.txt > hello.uu
uudecode hello.uu
Первый аргумент задаёт входной файл, второй – имя, которое запишется в строку begin. uudecode создаёт файл с этим именем в текущем каталоге. Добавьте -m к uuencode, чтобы получить вместо этого Base64.
В Python binascii кодирует по одной строке длиной до 45 байтов за раз:
import binascii
binascii.b2a_uu(b"Cat", backtick=True) # b'#0V%T\n'
binascii.a2b_uu(b"#0V%T") # b'Cat'
Строку begin 644 name, завершающую строку с обратной кавычкой и end добавьте сами. Другие примеры кодирования есть на странице о Python.
Частые проблемы
- Ошибка в позиции 1. Строки
beginнет, и текст не похож на голые строки uuencode. Проверьте, что скопировали блок целиком. - Мусор на выходе из блока
begin-base64. Такой блок записан командойuuencode -mи содержит Base64. Скопируйте строки междуbegin-base64и====в декодер Base64. - Файл обрезан или байты в конце строк неправильные. Почтовый клиент переразбил строки или обрезал пробелы в конце. Каждая строка данных должна быть целой; попробуйте достать исходное вложение или исходный текст письма.
- Многочастный пост декодируется лишь частично. Большие файлы часто разбивали на несколько сообщений. Перед декодированием соедините части по порядку, оставив один
beginи одинend.
Вопросы и ответы
Как исправить uuencode: command not found?
В большинстве дистрибутивов Linux эта команда не установлена по умолчанию. В Debian и Ubuntu sudo apt install sharutils добавит uuencode и uudecode; в Fedora тоже есть пакет sharutils.
Что означает begin 644?
644 задаёт права доступа Unix, которые получит декодированный файл (владелец читает и пишет, остальные только читают), а слово после них – имя файла. uudecode создаёт файл с этим именем; эта страница использует его для Сохранить байты.
Есть ли разница между uuencode и Base64?
Оба превращают 3 байта в 4 символа, но uuencode использует диапазон ASCII от пробела до подчёркивания и добавляет в каждую строку символ длины. У Base64 другой алфавит, и именно его использует почта MIME. uuencode -m пишет Base64 внутри блока begin-base64.
Умеет ли Python до сих пор декодировать uuencode?
Да, с помощью binascii.a2b_uu, по одной строке за раз. Высокоуровневый модуль uu объявлен устаревшим в Python 3.11 и удалён в 3.13.