如何进行 uuencode 和 uudecode
编码:
- 在 输入 · 文本 中输入或粘贴文本。uuencode 编码块显示在 输出 · uuencode 中。
- 在输出下方设置 文件名,它会写进
begin行。默认是data.bin。 - 如果只需要编码后的数据行(比如要嵌入其他格式中),取消勾选 begin/end 行。
解码:
- 在方向切换中点击 uuencode → 文本。
- 粘贴 uuencode 数据。可以连同周围的邮件或新闻组文字一起粘贴;
begin行之前的内容都会被跳过。 - 在输出中查看文本,或点击 保存字节,以
begin行中的文件名下载解码后的文件。对于二进制内容,可以先把 到 设为 Hex 查看一下。
uuencode 文件的结构
用文件名 hello.txt 编码文本 Cat,得到:
begin 644 hello.txt
#0V%T
`
end
begin 644 hello.txt给出 Unix 权限和文件名。- 每个数据行以一个长度字符开头:该行的字节数加 32。
#是 35,所以这一行有 3 个字节。完整的一行有 45 个字节,以M开头,后面跟 60 个字符。 - 数据字符的原理和 Base64 很像:每 3 个字节变成 4 个 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:M 行有 45 个字节,* 行有 10 个(42 − 32 = 10)。每一行都带有自己的长度字符和一个换行符,所以 uuencode 数据比输入大约大 38%,比 Base64 略多。
uuencode 还会出现在哪里
uuencode 源自 Unix-to-Unix Copy(UUCP),在 MIME 出现之前,是通过电子邮件和 Usenet 发送二进制文件的标准方式。如今,你会在旧的邮件归档、Usenet 帖子、一些嵌入式和大型机的文件传输,以及把文件通过管道传给 mail 的脚本中遇到它。
反引号的约定也来自那个年代。有些网关会删掉行尾的空格,这会破坏用空格表示零的数据;反引号则能保留下来。本编码器写出反引号,解码器两种都接受。
在命令行和 Python 中使用 uuencode
安装 GNU sharutils 之后:
uuencode hello.txt hello.txt > hello.uu
uudecode hello.uu
第一个参数是输入文件,第二个是写进 begin 行的名字。uudecode 会在当前目录中以这个名字创建文件。给 uuencode 加上 -m 则改为输出 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 邮件使用的是 Base64。uuencode -m 会在 begin-base64 块中写入 Base64。
Python 还能解码 uuencode 文件吗?
能,用 binascii.a2b_uu 逐行解码。更高层的 uu 模块在 Python 3.11 中被弃用,并在 3.13 中移除。