免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1040 | 回复: 0
打印 上一主题 下一主题

uuencode的使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-08 10:41 |只看该作者 |倒序浏览
今天在看Phrack的文章的时候,看到代码的压缩包都经过了编码,不知道如何获得代码。
看了一下comment,发现编码方式叫做uuencode,赶紧google一下。
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?\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`.HIWSI4%(^JR]_&>'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\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));
    outbuf [2] = ENCODE_BYTE (((inbytep [1] & 0x0F) > 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] > 4) & 0x03;
      outbyte [1] > 2) & 0x0F;
      outbyte [2]
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/12592/showart_355894.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP