使用方法
- 选择“编码”生成 uuencode 数据块,或选择“解码”从数据块中还原数据。
- 如果结果要交给 uudecode 命令使用,请保留 begin 和 end 行并填写文件名;关闭该选项则只输出数据行。
- 输入或粘贴内容,也可以打开文件对其字节进行编码。
- 解码时粘贴完整的数据块(如有 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.is | begin 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 解码,反之亦然。