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

参见

参考资料

本条目部分或全部内容出自以GFDL授权发布的《自由线上电脑词典》(FOLDOC)。

外部链接