Uuencode 编码与 Uudecode 解码

用经典的 Unix-to-Unix 格式编码文本、十六进制字节或文件,或者把旧邮件、Usenet 存档和脚本中的 uuencode 数据块解码还原。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 选择“编码”生成 uuencode 数据块,或选择“解码”从数据块中还原数据。
  2. 如果结果要交给 uudecode 命令使用,请保留 begin 和 end 行并填写文件名;关闭该选项则只输出数据行。
  3. 输入或粘贴内容,也可以打开文件对其字节进行编码。
  4. 解码时粘贴完整的数据块(如有 begin 行请一并粘贴),然后复制结果或下载为文件。

什么是 uuencode?

uuencode 是 Unix-to-Unix encode 的缩写,诞生于 1980 年前后,当时 Unix 机器之间通过只能传输文本的 UUCP 链路复制文件。它把每 3 个字节拆成 4 个 6 位的值,每个值加上 32,得到从空格到下划线之间的可打印字符。由于邮件系统常常会删掉行尾的空格,数值 0 通常写成反引号(`)而不是空格,本工具也是这样处理的。

uuencode 文件有固定的格式:

  • 头部行 begin 644 文件名,其中 644 是八进制的 Unix 文件权限(所有者可读写,其他人只读),文件名是解码时要创建的文件。
  • 数据行,每行最多对应 45 个输入字节。行首是长度字符(32 加上字节数,所以满行以 M 开头),后面最多跟 60 个编码字符。
  • 一行只有一个反引号,表示 0 个字节,最后是 end 行。

算上长度字符和换行符,输出约比原数据大 38%。

uuencode 的现状

在 MIME 出现之前,uuencode 是通过电子邮件发送程序和图片、在 Usenet 上发布文件的常用方式。到了 20 世纪 90 年代,MIME Base64 逐渐取代了它:uuencode 无法声明内容类型,存在多个互不兼容的变体,而且部分标点字符在 ASCII 与 EBCDIC 系统之间的网关上会被篡改,xxencode 正是为此而生。

如今在邮件和新闻组存档、较老的 shell 脚本以及遗留系统中,仍能见到 uuencode 数据。新项目请使用 Base64,整个文件可以用 文件转 Base64。

在命令行和 Python 中使用 uuencode

# Shell(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 文本里有反引号?

数值 0 本应对应空格,而行尾的空格在传输中经常丢失,所以包括本工具在内的许多编码器改用反引号表示。解码时两种写法都能识别。

begin 644 是什么意思?

它标志着编码数据块的开始。644 是还原后文件的 Unix 权限(所有者可读写,其他人只读),后面的词是 uudecode 将要创建的文件名。文件名可以在选项中设置。

没有 begin 行也能解码吗?

可以。如果没有 begin 行,所有行都会被当作数据解码;如果有,解码会从 begin 行之后开始,到 end 行结束,数据块前后的邮件正文等内容会被跳过。被邮件软件删掉的行尾空格也会自动补回。

uuencode 和 Base64 一样吗?

不一样。两者都把 3 个字节变成 4 个字符,但 uuencode 使用不同的字符范围,每行有长度字符,还有 begin 和 end 行。Base64 的结果不能当作 uuencode 解码,反之亦然。