ORF反垃圾邮件系统

邮件服务器-邮件系统-邮件技术论坛(BBS)

 找回密码
 会员注册
查看: 7803|回复: 1
打印 上一主题 下一主题

[求助] 关于q编码解码问题

[复制链接]
跳转到指定楼层
顶楼
发表于 2008-6-30 11:51:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
=A8C=A8C=A8C=A8C=A8C=A8C=A8C=A8C=A8C=A8C=A8C=A8C=A8C=A8C=A8C=A8C=A8C=A8C

按照协议不应该是 =A8 加一个C吗
不过实际上解码应该是------

为什么?
沙发
发表于 2008-7-8 11:53:35 | 只看该作者
编码问题不是很熟,不知道以下文章对你是否能有所帮助?

CU 多媒体邮件编码的一点解析
参考:CU多媒体邮件终端功能规范 & [RFC]

对于发件人、回复(Reply-to)、地址栏字段中的呢称,或者是主题和附件文件名,如果采用如下的任一MIME编码类型进行了编码,在保存邮件之前,邮件服务客户端将应对这些字段进行解码。
字符集        MIME编码类型
us-ascii        B type        Q type
iso-8859-1        B type        Q type
GB2312(GBK)        B type        Q type
HZ-Gb-2312        B type        Q type
UTF-8        B type        Q type
1.1.7.1.2  正文
邮件的正文部分支持如下的字符集:
US-ASCII
SO-8859-1
GB2312(GBK)
HZ-GB-2312
UTF-8
邮件正文的编码:
7-bit
8-bit
quoted-printable
Base64
附件的编码:
Base64
uuencode
quoted-printable
Binhex

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&<FJM.B'@(“'@(“'@
M2&5N<GDL($@N62X@5VJN9PT*4W5B:F5C=#H@(“'@($%B;W5T($U)344@96YC
M;VIE=VIE8V1E8VJD92!P<FJG<F%M#0I4;SH @(“'@(“'@(“'@0VAA<FQE<R!-80T*
M;W(@8F%S938T(‘1R86YS9F5R(&9O<FUA=”P-“B' @(“'@(“'@(“'@(“UO(#QF
关于电子邮件中二进制数据的文本化编码工具uuencode
名称:uuencode
使用权限:所有使用者
使用方式:uuencode [-hv] [sourcefile] targetfile
说明:
早期在许多 unix 系统的传送协定只能传送七位元字元,并不支援二进位档案,像中文文字档就有用到八位元,所以无法完整地送到另一架机器上。 uuencode 指令,可以将二进位档转换成七位元的档案,传送到另一架机器上再以 uudecode 还原。最常见的是用在以电子邮件传送二进位档。uuencode 编码后的资料都以 begin 开始,以 end 作为结束。
begin *** decode.dat
(内容编码)
end
begin 后的 *** 是 unix 档案的调用权限代码。而 decode.dat 则是还原后的档名。
参数:
h 列出指令使用格式 (help)
v 列出版本讯息 (version)
范例:
将 source.dat 编码后存成 file.uud 档。由于 uuencode 会将编码后的资料在荧幕上列出,所以必须将资料导入 file.uud 中,而 target.dat 是 file.uud 还原后的档案名字,而不是编码后的档案。
uuencode source.dat target.dat > file.uud
执行指令后,由标准输入装置读入资料,简单地说是由键盘输入后在荧幕显示的资料,按 Crtl + d 键后就会被编码,输出至 file.uud 中。由于程序是以行为处理单位,若无法跳出程序,请多按几次 Ctrl + d 直到程序结束为止。
uuencode target.dat > file.uud
类似上一个指令,不过使用一个导入的技巧,将 source.dat 压缩后的资料传送给 uuencode 处理之后,存成 file.uud 档。 file.uud 档还原后就是source.dat.Z 档。
compress -c source.dat | uuencode source.dat.Z > file.uud
显示版本讯息后,结束执行程序。
uuencode -v

Base64编码:
Base64算法是把3个8位字符(24)转换成4个6位字符(32),因此编码后的长度会扩大1/3,进行编码转换时需要用到一张Base64的编码表:
                            Table 1: The Base64 Alphabet

      Value Encoding  Value Encoding  Value Encoding  Value Encoding
           0 A            17 R            34 i            51 z
           1 B            18 S            35 j            52 0
           2 C            19 T            36 k            53 1
           3 D            20 U            37 l            54 2
           4 E            21 V            38 m            55 3
           5 F            22 W            39 n            5***
           6 G            23 X            40 o            57 5
           7 H            24 Y            41 p            58 6
           8 I            25 Z            42 q            59 7
           9 J            26 a            43 r            60 8
          10 K            27 b            44 s            61 9
          11 L            28 c            45 t            62 +
          12 M            29 d            46 u            63 /
          13 N            30 e            47 v
          14 O            31 f            48 w         (pad) =
          15 P            32 g            49 x
          16 Q            33 h            50 y
在VB中可以简单的将其保存为一个常量:
Private Const Base64Table =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
编码过程是这样的,第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符,然后将第一个字符左移6位加上第二个字符右移4位,即获得第二个目标字符,再将第二个字符左移4位加上第三个字符右移6位,获得第三个目标字符,最后取第三个字符的右6位即获得第四个目标字符.

例如我们取一个简单的字符串"TEST..."
将其用SourceByte = StrConv(SourceText, vbFromUnicode)转换后获得二进制数组:
T         E         S         T            ...
84        69        83        84           ...
01010100  01000101  01010011  01010100     ...
01010100/01000101/01010011/01010100
01010100010001010101001101010100
转换后:
01010100010001010101001101010100
010101/000100/010101/010011/010101/00
010101    000100    010101    010011    010101    00....
21        4         21        19        21        ...
V         E         V         T         V         ...
最后得到的就是"VEVTV..."

对于第一个目标字符我们可以这样做:
(SourceByte(1) and 252)/4
第二个:
(SourceByte(1) and 3)*64 + (SourceByte(2) and 240)/16
第三个:
(SourceByte(2) and 15)*16 + (SourceByte(3) and 48)/64
第四个:
(SourceByte(3) and 63)

Base64解码过程正好相反,另外有关MIME的RFC还是有很多的,如果需要详细情况请自己查找,上面那张表就摘自
<RFC1521#
MIME (Multipurpose Internet Mail Extensions)
Part One: Mechanisms for Specifying and Describing the Format of Internet
Message Bodies>
您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

小黑屋|手机版|Archiver|邮件技术资讯网

GMT+8, 2024-12-22 23:49

Powered by Discuz! X3.2

© 2001-2016 Comsenz Inc.

本论坛为非盈利中立机构,所有言论属发表者个人意见,不代表本论坛立场。内容所涉及版权和法律相关事宜请参考各自所有者的条款。
如认定侵犯了您权利,请联系我们。本论坛原创内容请联系后再行转载并务必保留我站信息。此声明修改不另行通知,保留最终解释权。
*本论坛会员专属QQ群:邮件技术资讯网会员QQ群
*本论坛会员备用QQ群:邮件技术资讯网备用群

快速回复 返回顶部 返回列表