如何进行 xxencode 和 xxdecode
编码:
- 在 输入 · 文本 中输入或粘贴文本。xxencode 编码块显示在 输出 · xxencode 中。
- 在输出下方把 文件名 设为接收方应该得到的名字;默认是
data.bin。 - 如果只需要数据行,取消勾选 begin/end 行。
解码:
- 在方向切换中点击 xxencode → 文本。
- 粘贴数据块。
begin行之前的任何文字(比如邮件头或附言)都会被跳过。 - 查看结果;对于二进制内容,把 到 设为 Hex;或点击 保存字节,以
begin行中的文件名下载。
为什么会有 xxencode
uuencode 的字母表是从空格(或反引号)到 _ 的所有字符,其中包括 [、]、^、\ 和 !。在 ASCII 与 EBCDIC 系统之间(其中包括 IBM 大型机和 BITNET 网络)的邮件网关上,这些字符会带来麻烦,因为它们在 EBCDIC 中没有唯一的对应字符。文件到达时字符被替换,解码出来就是乱码。
xxencode 保留了 uuencode 的结构,把字母表换成了 64 个能可靠转换的字符:+、-、0–9、A–Z 和 a–z。值 0 是 +,值 1 是 -,数字从值 2 开始,小写 z 是 63。
uuencode 与 xxencode 对比
同样的输入分别用两种格式编码,文件名为 hello.txt:
| 输入 | uuencode 数据行 | xxencode 数据行 |
|---|---|---|
Cat | #0V%T | 1Eq3o |
Hello, world | ,2&5L;&\L('=O<FQD | AG4JgP4wg65RjQalY |
| 4 个零字节 | $```````` | 2++++++++ |
每行的第一个字符是用该格式自己的字母表表示的字节数:3 在 uuencode 中是 #,在 xxencode 中是 1;12 分别是 , 和 A;4 分别是 $ 和 2。完整的 45 字节行在 uuencode 中以 M 开头,在 xxencode 中以 h 开头。
一个完整的 xxencode 文件是这样的,这里编码的是保存为 fox.txt 的 The quick brown fox jumps over the lazy dog. 0123456789:
begin 644 fox.txt
hJ4VZ653pOKBf647mPrRi64NjS0-eRKpkQm-jRaJm65FcNG-gMLdt64FjNmsU
8A12mAnEpBXQsCE++
+
end
大小与 uuencode 相同:每 3 个字节 4 个字符,每行再加一个长度字符和一个换行符,比输入大约大 38%。
在 Python 中使用 xxencode
Python 没有 xxencode,但 binascii.b2a_uu 生成的是同样的 6 位值,所以把它的输出从 uuencode 字母表转换为 xxencode 字母表,就能得到正确的 xxencode 行,包括长度字符:
import binascii
UU = "`" + "".join(chr(c) for c in range(33, 96))
XX = "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
TO_XX = str.maketrans(UU, XX)
def xxencode_line(chunk: bytes) -> str:
return binascii.b2a_uu(chunk, backtick=True).decode().translate(TO_XX)
xxencode_line(b"Cat") # '1Eq3o\n'
每次传入 45 个字节,然后在顶部加上 begin 644 name,在底部加上 + 和 end。解码时,用 str.maketrans(XX, UU) 转换,再对每一行调用 binascii.a2b_uu。字节和编码的更多内容见 Python 页面。
常见问题
- 据说是 xxencode 的文件解码出乱码。 检查完整行的第一个字符。如果是
M,文件是 uuencode 编码的;请使用 uuencode 工具。 - 某一行解码出的长度不对。 长度字符被改动或丢失了,通常是邮件客户端重新换行造成的。被拆分或合并的行,xxencode 无法恢复。
- 解码后的文件被截断。 数据块是分几部分发布的。按顺序把它们拼起来,只保留一个
begin和一个end,再解码。
常见问题
xxencode 和 uuencode 有什么区别?
只有字母表不同。两者都把 3 个字节写成 4 个字符,每行最多 45 个字节并带一个长度字符,用 begin 和 end 包围。uuencode 使用从反引号和 ! 到 _ 的 ASCII 范围;xxencode 使用 +、-、数字和字母。
怎样判断一个文件是 xxencode 还是 uuencode?
看完整数据行的第一个字符:M 表示 uuencode,h 表示 xxencode,两者都代表 45 个字节。满是 `、# 或 % 等标点的行是 uuencode。
用什么程序解码 xxencode 文件?
UUDeview 两种格式都能处理;在 Debian 和 Ubuntu 上是 uudeview 软件包。GNU sharutils 中的 uudecode 能读取 uuencode 和 Base64,但不能读取 xxencode。
为什么 xxencode 文件以一行 + 结尾?
+ 是 xxencode 中表示 0 的字符,所以只有 + 的一行是长度为零的数据行。它的作用与 uuencode 中 end 之前那行单独的反引号相同。