分类: LINUX
2007-08-08 10:41:11
uuencode解码步骤
uuencode是以前unix下常用编码方式应用于UUCP(unix to unix copy),通过串行通讯传
输二进制文件.base64属于MIME(多用途国际互联网
邮件扩展)编码,与uuencode不是同一个范畴的,MIME主要应用于邮件,Uuencode主要应用
在邮件和新闻组.
uuencode的开头是:
begin <模式> <文件名>
<数据>
end
编码算法为不断地用3个字节数据列成一组(不足3个字节以零补齐)然后 此24位数据分
为4
组,每组6位,再将得到的6位二进制数映射到ASCII码32~95之间的字符,而每行以M
开头(表示32+45),60个字符一行(包括”M”),最后一行以32+N 的ASCII字符开头,N
为最后一行编码的输入字节数.编码以一个只含一个空格的一行和只含”end”的一行结束.
从前一部分看和base64没有什么区别(关于base64的编码和解码请参见http://www.csdn.net/develop/read_article.asp?id=8843),都是将3个字符换成4个字符,不同的是base64由自己的base64码表,而uuencode是直接使用ascii码做码表.
eg.
begin .....
M1&%T93H(“’@(“’@(#0O-2’\Y-2’Y.C,S.C$P($%-#0I&
begin 644 stuff.tgz
M'XL(`!J,'T8``^P\^W/;-M+Y59KI_X!1&X>2Y8B49-FQZLRHL=SXXM?XD;87
M9S@4"=H\4Z1*4H[<-/>WW^X")$&*=I*>D]XW7]C:)@'LXK$/["X6B9.YZW8>
M?=%'AV=C?1W_&AOK.GT;_3[]E<\C0Q_HW6Y77Q]T'^E&M[?>?\36O^RPQ#./
M$RMB[%'RSOOC_G8\BN^I3R>2_OT_\L1$?[Z8^5^."3Z'_EV]!_3O]8QO]/\J
。。。。。。
M^QLZ*/YN[[NC_K?\,--UL&OHC!K0UB`>WC`.<.3+B_R7#T9PU/G"1:F1VJ4J
M&(GAW^!E@J!JS,*8C9RWUT4)>HIWSI4%(^JR<;I7$VY`BP'9,M*V;GY7QEA4
M]_&>'Z>G^?G^7E^GI_GY_EY?IZ?Y^?Y>7Z>G^?G^7E^GI_GY_EY?IZ?
HY^?Y>7Z>G^?G^7E^GI_GY_EY?IZ?Y^?Y>7Z>G\<]_Q=OV)(^``@"````
`
end
拷贝到一个文本当中去,这里取名为1
wangyao@netkite:~/Desktop$ uudecode 1
这时候,目录下面就会有一个stuff.tar.gz,就是代码了。
同样还有一种是base64编码的,例如
后面的代码是经过base64编码过的,其形式稍微有所不同。
begin-base64 644 hack_grub.tar.gz
H4sIADW+x0IAA+19a49kSXZQ7i6wZK1tbEAyHxCKqZnuyczKqsrMenRN5XTv
VldXz9ZOd1W7q3p27J7m7q3Mm1V3Ol99b2Z318w2QgjxwQghIRkLI9viAxL8
......
4lehcOHQYYVXF7eskBcbrfAyEdcKLxHqrfDqIs7lVG726HeFlwq+5+R++UiA
SaZOiEFYeKlghxct6PLxG/NKshC/TNxJjWTGYJeFlwisWXipkJ5vWzHNr/k1
v+bX/Jpf82t+za/5Nb/m1/yaX/PrDVz/H1KGin8AGAEA
====
它不是以end结尾的。
解码步骤跟上面一样。
uuencode编码的原理:
参考:http://blog.21ic.com/user1/1575/archives/2005/5608.html
===== 编码 =====
uu 编码uuencode 编码方式用于将任意的二进制文件转换为文本文件,比如email.转换后的文件中仅包含可打印字符.
uuencode 运算法则将连续的 3字节编码转换成 4字节(8-bit 到 6-bit)的可打印字符. 该编码的效率高于Hex 格式从二进制文件中读取 3字节的数据, 表示如下(a7 表示 a字节的第 7位):
a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0 c7c6c5c4c3c2c1c0
转换它们到4字节里为如下所示:
0 0 a7a6a5a4a3a2 0 0 a1a0b7b6b5b4 0 0 b3b2b1b0c7c6 0 0 c5c4c3c2c1c0
然后, 每个字节再加 0x20转换为可打印的字符.
注意: 如果是一个 0字节那它应该被转换为0x60而不是0x20, 因为(前引用'`')优于 0x20(空格' ').例如: 从文件中读取的 3字节如下:
14 0F A8
00010100 00001111 10101000
转换为 6-bit:
000101 000000 111110 101000
每字节高两位补 0后为:
00000101 00000000 00111110 00101000
最后每字节再加 0x20,则 4字节输出应该为:
25 60 5E 48
注意: 00字节被转换为 0x60而不是 0x20.因此, 在一个 uuencoded文件中仅包含字符 0x21 '!'到 0x60 '`',它们都是可打印和可被 email传送的.
这个转换过程也意味着 uuencoded 文件要比原文件大 33%的.outbuf [4] 输出 uu编码数据.
inbytep [3] 输入二进制数据.#define ENCODE_BYTE(b) (((b) == 0) ? 0x60 : ((b) + 0x20))
outbuf [0] = ENCODE_BYTE ((inbytep [0] & 0xFC) >> 2);
outbuf [1] = ENCODE_BYTE (((inbytep [0] & 0x03) << 4) +
((inbytep [1] & 0xF0) >> 4));
outbuf [2] = ENCODE_BYTE (((inbytep [1] & 0x0F) << 2) +
((inbytep [2] & 0xC0) >> 6));
outbuf [3] = ENCODE_BYTE (inbytep [2] & 0x3F);===== 解码 =====
linep [4] 输入 uu编码数据.
outbyte [3] 输出二进制数据.#define DECODE_BYTE(b) ((b == 0x60) ? 0 : b - 0x20)
outbyte [0] = DECODE_BYTE (linep [0]);
outbyte [1] = DECODE_BYTE (linep [1]);
outbyte [0] <<= 2;
outbyte [0] |= (outbyte [1] >> 4) & 0x03;
outbyte [1] <<= 4;
outbyte [2] = DECODE_BYTE (linep [2]);
outbyte [1] |= (outbyte [2] >> 2) & 0x0F;
outbyte [2] <<= 6;
outbyte [2] |= DECODE_BYTE (linep [3]) & 0x3F;详细描述见
// 结束.