Uuencode
uuencode这个名字是衍生自"Unix-to-Unix encoding",原先是Unix系统下将二进位的数据借由uucp邮件系统传输的一个编码程序,是一种二进位到文本的编码。uudecode是与uuencode搭配的解码程序,uuencode/decode常见于电子邮件中的文件发送以及usenet新闻群组和BBS的贴文等等。近来已被MIME所大量取代。
编码进程
Uuencode的编码结果输出文件格式如下:
begin <输入档访问模式> <输入文件名>
<编码内容>
[<编码内容>]
[...]
`
end
<输入档访问模式>
沿用自Unix系统文件访问权限模式,由三个八进位的数字组成,其构成形式为:
拥有人 | 群组 | 其他人 | ||||||
读取(r) | 写入(w) | 运行(x) | 读取(r) | 写入(w) | 运行(x) | 读取(r) | 写入(w) | 运行(x) |
举例而言:当<输入档访问模式>为 666,转换成二进位码为110110110,也就是拥有人、群组以及其他人对于这个文件都有读取以及写入的权力。
<输入文件名>
将编码前的文件名填入。
<编码内容>
当文件内容空无一物时,<编码内容>就不存在。否则<编码内容>会以下面形式出现:
<长度字符><编码字符字符串>
Uuencode将输入数据以每三个字节为单位进行编码,如此重复进行。如果最后剩下的数据少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6-bit为单位分为4个群组,每个群组以十进位来表示所出现的数值只会落在0到63之间。将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白...95-底线)的范围之中。
<长度字符>
每60个编码输出(相当于45个输入字节)将输出为独立的一行,每行的开头会加上长度字符,除了最后一行之外,长度字符都应该是'M'这个ASCII字符(77=32+45),最后一行的长度字符为32+剩下的字节数目这个ASCII字符。
<编码字符字符串>
<编码字符字符串>是依照编码结果依序填入,惟独要注意一点:当6-bit的数据为零时,编码应为空白这个字符,但是在uuencode中都用`这个字符来取代,这是因为它们的末六bit都是 100.000。
例外状况
前面所说的只适用于使用ASCII字符集的电脑系统,有些比较旧型的电脑他们使用非ASCII字符集(如EBCDIC字符集)。要解决这个问题,Xxencode是较为适切的编码系统,它只使用到文数字字符集以及加减号字符。
uuencode编码范例
简短的例子
下面的表格显示如何将Cat
这三个ASCII字符编码成uuencode的0V%T
:
原始字符 | C |
a |
t | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
原始ASCII码(十进位) | 67 | 97 | 116 | |||||||||||||||||||||
ASCII码(二进位) | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
新的十进位数值 | 16 | 54 | 5 | 52 | ||||||||||||||||||||
+32 | 48 | 86 | 37 | 84 | ||||||||||||||||||||
编码后的Uuencode字符 | 0 |
V |
% |
T |
因此Cat这三个ASCII字符表示成uuencode的文件形式:
begin 644 cat.txt
#0V%T
`
end
长范例
底下是引用自英文版的一段文本,将其存成test.txt,引用文本如下:
Each group of sixty output characters (corresponding to 45 input bytes) is output as a separate line preceded by an encoded character giving the number of encoded bytes on that line. For all lines except the last, this will be the character 'M' (ASCII code 77 = 32+45). If the input is not evenly divisible by 45, the last line will contain the remaining N output characters, preceded by the character whose code is 32 + the number of remaining input bytes. Finally, a line containing just a single space (or grave character) is output, followed by one line containing the string "end".
使用uuencode编码后的文件为:
begin -666 test.txt
M16%C:"!G<F]U<"!O9B!S:7AT>2!O=71P=70@8VAA<F%C=&5R<R`H8V]R<F5S
M<&]N9&EN9R!T;R`T-2!I;G!U="!B>71E<RD@:7,@;W5T<'5T(&%S(&$@<V5P
M87)A=&4@;&EN92!P<F5C961E9"!B>2!A;B!E;F-O9&5D(&-H87)A8W1E<B!G
M:79I;F<@=&AE(&YU;6)E<B!O9B!E;F-O9&5D(&)Y=&5S(&]N('1H870@;&EN
M92X@1F]R(&%L;"!L:6YE<R!E>&-E<'0@=&AE(&QA<W0L('1H:7,@=VEL;"!B
M92!T:&4@8VAA<F%C=&5R("=-)R`H05-#24D@8V]D92`W-R`](#,R*S0U*2X@
M268@=&AE(&EN<'5T(&ES(&YO="!E=F5N;'D@9&EV:7-I8FQE(&)Y(#0U+"!T
M:&4@;&%S="!L:6YE('=I;&P@8V]N=&%I;B!T:&4@<F5M86EN:6YG($X@;W5T
M<'5T(&-H87)A8W1E<G,L('!R96-E9&5D(&)Y('1H92!C:&%R86-T97(@=VAO
M<V4@8V]D92!I<R`S,B`K('1H92!N=6UB97(@;V8@<F5M86EN:6YG(&EN<'5T
M(&)Y=&5S+B!&:6YA;&QY+"!A(&QI;F4@8V]N=&%I;FEN9R!J=7-T(&$@<VEN
M9VQE('-P86-E("AO<B!G<F%V92!C:&%R86-T97(I(&ES(&]U='!U="P@9F]L
M;&]W960@8GD@;VYE(&QI;F4@8V]N=&%I;FEN9R!T:&4@<W1R:6YG(")E;F0B
!+@``
`
end
Uuencode对照表
下面的表格显示uuencode所使用到的ASCII字符集、6-bit二进位码以及十进位的对照。由上面Cat的例子可以看出其第一个编码为十进位的16,对应下面表格uuencode十进位表示字段,可以查出其uuencode的输出码为0。
可打印的字符 | 十进位ASCII值 | uuencode 二进位表示 |
uuencode 十进位表示 |
可打印的字符 | 十进位ASCII值 | uuencode 二进位表示 |
uuencode 十进位表示 | |
---|---|---|---|---|---|---|---|---|
(space) | 32 | 000 000 | 0 | @ | 64 | 100 000 | 32 | |
! | 33 | 000 001 | 1 | A | 65 | 100 001 | 33 | |
" | 34 | 000 010 | 2 | B | 66 | 100 010 | 34 | |
# | 35 | 000 011 | 3 | C | 67 | 100 011 | 35 | |
$ | 36 | 000 100 | 4 | D | 68 | 100 100 | 36 | |
% | 37 | 000 101 | 5 | E | 69 | 100 101 | 37 | |
& | 38 | 000 110 | 6 | F | 70 | 100 110 | 38 | |
' | 39 | 000 111 | 7 | G | 71 | 100 111 | 39 | |
( | 40 | 001 000 | 8 | H | 72 | 101 000 | 40 | |
) | 41 | 001 001 | 9 | I | 73 | 101 001 | 41 | |
* | 42 | 001 010 | 10 | J | 74 | 101 010 | 42 | |
+ | 43 | 001 011 | 11 | K | 75 | 101 011 | 43 | |
, | 44 | 001 100 | 12 | L | 76 | 101 100 | 44 | |
- | 45 | 001 101 | 13 | M | 77 | 101 101 | 45 | |
. | 46 | 001 110 | 14 | N | 78 | 101 110 | 46 | |
/ | 47 | 001 111 | 15 | O | 79 | 101 111 | 47 | |
0 | 48 | 010 000 | 16 | P | 80 | 110 000 | 48 | |
1 | 49 | 010 001 | 17 | Q | 81 | 110 001 | 49 | |
2 | 50 | 010 010 | 18 | R | 82 | 110 010 | 50 | |
3 | 51 | 010 011 | 19 | S | 83 | 110 011 | 51 | |
4 | 52 | 010 100 | 20 | T | 84 | 110 100 | 52 | |
5 | 53 | 010 101 | 21 | U | 85 | 110 101 | 53 | |
6 | 54 | 010 110 | 22 | V | 86 | 110 110 | 54 | |
7 | 55 | 010 111 | 23 | W | 87 | 110 111 | 55 | |
8 | 56 | 011 000 | 24 | X | 88 | 111 000 | 56 | |
9 | 57 | 011 001 | 25 | Y | 89 | 111 001 | 57 | |
: | 58 | 011 010 | 26 | Z | 90 | 111 010 | 58 | |
; | 59 | 011 011 | 27 | [ | 91 | 111 011 | 59 | |
< | 60 | 011 100 | 28 | \ | 92 | 111 100 | 60 | |
= | 61 | 011 101 | 29 | ] | 93 | 111 101 | 61 | |
> | 62 | 011 110 | 30 | ^ | 94 | 111 110 | 62 | |
? | 63 | 011 111 | 31 | _ | 95 | 111 111 | 63 | |
` | 96 | (1) 000 000 | 64 |
外部链接
- UUDeview (页面存档备份,存于) - 适用于Unix/Windows/DOS等操作系统,使用Base64, BinHex, uuencode, xxencode, ...等方法编/解码的开放源码程序。
- 在线uuencode编码与解码(页面存档备份,存于)