使用方法
- 选择“编码”生成 xxencode 数据块,或选择“解码”把数据块还原为数据。
- 保留 begin 和 end 行并设置文件名可得到完整的数据块;关闭该选项则只输出数据行。
- 输入或粘贴内容,也可以打开文件,结果会随输入实时更新。
- 复制或下载结果。解码时如果数据不是文本,请选择十六进制输出或直接下载文件。
什么是 xxencode?
xxencode 保留了 uuencode 的结构,只更换了字符。它同样把每 3 个字节拆成 4 个 6 位的值,每个数据行同样以长度字符开头、最多对应 45 个字节,整个数据块同样位于 begin 644 文件名 行和 end 行之间。
64 个值依次对应 +、-、数字 0-9、大写字母 A-Z 和小写字母 a-z。长度字符也使用同一张表,因此满 45 字节的行以 h 开头,end 之前的空行则是一个 +。由于格式完全相同,输出大小也与 uuencode 一样:算上长度字符和换行符,约比原数据大 38%。
xxencode 诞生的原因
uuencode 的结果中有大量标点符号,例如 [、]、\、^ 和 !。IBM 大型机使用 EBCDIC 而不是 ASCII,而这些字符在不同的 EBCDIC 代码页中位置并不相同。邮件经过 ASCII 网络与 EBCDIC 网络之间的网关时,这些字符可能被错误转换,导致文件损坏。
字母、数字、加号和减号在所有 EBCDIC 代码页中都是一致的,因此 xxencode 文本可以在两种字符集之间双向无损转换。后来的 MIME 也采用了同样的思路:Base64 只使用字母、数字和少数在 ASCII 与 EBCDIC 中完全相同的符号。xxencode 从未像 uuencode 那样普及,最终两者都被 Base64 取代。
uuencode 与 xxencode 对比
| uuencode | xxencode | |
|---|---|---|
| 字符 | ASCII 32 到 95,零值用反引号 | + - 0-9 A-Z a-z |
| 满 45 字节的行开头 | M | h |
| end 之前的最后一行 | ` | + |
| 能否安全通过 EBCDIC 网关 | 否 | 是 |
编码规格
| 字母表 | + - 0-9 A-Z a-z |
|---|---|
| 输出体积 | 约 137%,含行首长度字符 |
| 填充 | 每行最多 45 字节 |
| 标准 | xxencode |
| 区分大小写 | 是 |
编码示例
| 输入 (UTF-8) | 输出 |
|---|---|
Hello, World! | begin 644 data.bin
BG4JgP4wg63RjQalY6E++
+
end |
Base64.is | begin 644 data.bin
7Ea3nNHMo9aZn
+
end |
你好 | begin 644 data.bin
4t9qUtOKx
+
end |
常见问题
如何区分 uuencode 和 xxencode?
看数据行即可。xxencode 的数据行只包含字母、数字、加号和减号,满行以
h 开头;uuencode 的数据行含有标点符号,满行以 M 开头。如果在这里解码时提示无效字符,可以试试 uuencode 页面。工具会生成 begin 和 end 行吗?
会。默认会输出带有你所填文件名的
begin 644 行以及结尾行。如果只需要编码后的数据行,关闭该选项即可。没有 begin 行也能解码吗?
可以。没有 begin 行时,所有非空行都会被当作数据解码;有 begin 行时,解码从它之后开始,到 end 行结束,前后的其他文字会被忽略。
xxencode 现在还有人用吗?
很少。如今主要出现在旧的邮件和新闻组存档中。新数据建议使用 Base64,它几乎处处受支持,在只能传输文本的渠道中同样安全。