中国科学技术大学 多媒体技术与网络通信实验室(copyright1999) 附录三 多媒体电子邮件 一、多媒体电子邮件基本概念 电子邮件室建立现代办公应用的重要通信方式,其优点在于及时、效率高,利用电子邮 件人们可以不受地域限制地进行信息交流。 最初,电子邮件的格式之限于ASCI字符书写的文本邮件,这种邮件目前仍然在Internet 上广泛使用。文本邮件由信头和信体两个部分组成,信头和信体的格式遵守有关的Internet 协议()。以下是一个文本邮件的例子: From:Fool@belle.eeis.ustc.edu.cn To:Wise@belle.eeis.ustc.edu.cn Subject:Mail Example Hi,Go to East Campus. 在文本邮件的基础上,人们不断将各种媒体引进邮件系统(如图像、动画、语音等), 形成了复杂的多媒体电子邮件系统。多媒体电子邮件的标准由CCTT和ISO共同制定的 X.400标准系列,对邮件的传输、存储及用户接口作出了规定,提供对多种媒体地支持。另 一个多媒体电子邮件地标准是Internet多媒体邮件扩展标准(MME).MME标准是对rfc822 中的文本文件的多媒体扩展,因此MME与rf心822邮件是向下兼容的,MME标准允许邮 件的信体由多部分组成或具有嵌套结构,而且信体的各个部分可以是各种媒体类型及“子类 型”(Subtype)。目前,MME标准支持以下类型及子类型。 表1MME标准的媒体类型 类型 子类型 意义 文本 普通文本 由US ASCII码书写的文本 复合文本 类似SGML语言的、多种字体文件 图像 Jpeg 用JPEG标准压缩的图像 Gif GF格式的图像 音频 Basic8 8比特、采样率为8KHz的PCM音频信号 影像 Mpeg 用MPEG标准编码的影像 ODA “开放文档结构”格式的文档 应用 Binary 二进制数据 Postscript Postscript中的文档 二、多媒体电子邮件的标准 RFC822邮件系统显著的局限性是只能采用US ASCII码字符,如果需要传输非文本的 文件,就必须在传输之前将其转换成7BIT的ASCI字符流(编码):接收时将ASCI字 符流再转换成二进制数据(解码)。例如我校BBS上的邮件就时这样,再传送非文本文件时 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.cdu.cn cxh@ustc.cdu.cn
中国科学技术大学 多媒体技术与网络通信实验室(copyright 1999) 附录三 多媒体电子邮件 一、多媒体电子邮件基本概念 电子邮件室建立现代办公应用的重要通信方式,其优点在于及时、效率高,利用电子邮 件人们可以不受地域限制地进行信息交流。 最初,电子邮件的格式之限于 ASCII 字符书写的文本邮件,这种邮件目前仍然在 Internet 上广泛使用。文本邮件由信头和信体两个部分组成,信头和信体的格式遵守有关的 Internet 协议()。以下是一个文本邮件的例子: From:Fool@belle.eeis.ustc.edu.cn To:Wise@ belle.eeis.ustc.edu.cn Subject:Mail Example Hi,Go to East Campus. 在文本邮件的基础上,人们不断将各种媒体引进邮件系统(如图像、动画、语音等), 形成了复杂的多媒体电子邮件系统。多媒体电子邮件的标准由 CCITT 和 ISO 共同制定的 X.400 标准系列,对邮件的传输、存储及用户接口作出了规定,提供对多种媒体地支持。另 一个多媒体电子邮件地标准是 Internet 多媒体邮件扩展标准(MIME)。MIME 标准是对 rfc822 中的文本文件的多媒体扩展,因此 MIME 与 rfc822 邮件是向下兼容的,MIME 标准允许邮 件的信体由多部分组成或具有嵌套结构,而且信体的各个部分可以是各种媒体类型及“子类 型”(Subtype)。目前,MIME 标准支持以下类型及子类型。 表 1 MIME 标准的媒体类型 类型 子类型 意义 普通文本 由 US ASCII 码书写的文本 文本 复合文本 类似 SGML 语言的、多种字体文件 Jpeg 用 JPEG 标准压缩的图像 图像 Gif GIF 格式的图像 音频 Basic8 8 比特、采样率为 8KHz 的 PCM 音频信号 影像 Mpeg 用 MPEG 标准编码的影像 ODA “开放文档结构”格式的文档 应用 Binary 二进制数据 Postscript Postscript 中的文档 二、多媒体电子邮件的标准 RFC822 邮件系统显著的局限性是只能采用 US ASCII 码字符,如果需要传输非文本的 文件,就必须在传输之前将其转换成 7 BIT 的 ASCII 字符流(编码);接收时将 ASCII 字 符流再转换成二进制数据(解码)。例如我校 BBS 上的邮件就时这样,再传送非文本文件时 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系 network@ustc.edu.cn cxh@ustc.edu.cn
中国科学技术大学 多媒体技术与网络通信实验室(copyright1999) 很不方便。目前完成这种格式转换的软件有:uuencode,3/4基64编码法(3/4Base64 Encoding),及ATK编码(Andrew Toolkit Representation)等。 在RFC1251是对RFC822电子邮件标准的多媒体扩展。RFC1251主要内容有:再信头 引入MME版本域(MIME Version Field)、内容类型域(Content-Type Field)、转换编码域 (Content-.Transfer-Encoding Field)、内容标识符(Content-lD)和内容描述符 (Content--Description)。以下为一个简单的示例: From:Fool@belle.eeis.ustc.edu.cn ∥源地址:Fool@bele.eeis.stc.edu.cn To:Wise@belle.eeis.ustc.edu.cn ∥目的地址:Wise@belle.eeis.usc.edu.cn Subject:Mail Example ∥邮件主题 Message-ID:Big Fool ∥发送者标识 MIME-Version:1.0 MME版本号 Content-Type:IMAGE/BMP ∥邮件为BMP画图格式 Content-Transfer--Encoding:BASE64∥邮件用3/4基64编码法编码 Content-ID:MsgFirst ∥消息的标识 Content-Description:Fool to Wise ∥消息的简要说明 其中内容标识符(Content-D)和内容描述符(Content-.Description)是可选的。内容类 型域(Content--Type Field)声明传送媒体的类型和子类型、转换编码域 (Content-.Transfer--Encoding Field)声明邮件的编码方式。 三、编码方法 “转换编码域”可选择的编码方法最常用的有两种:Quoted--Printable编码法(适用于 含有大量7BT字符的数据)、3/4基64编码法(适用于二进制数据)。 Quoted-.Printable编码法基本规则是:被编码的数据以8BIT的字节为单位,每个字节用 等号“=”和其十六进制形式表示,如值12的编码是“=0C”:但如果被编码的是可打印的 字符,就用本生BIT的ASCⅡ字符表示,如a的编码是“a”。用这种编码方法编码的数据 的可读性是比较强的。 3/4基64编码法(3/4Basc64 Encoding)适用于不可读的二进制文件。编码、解码都比 较简单,编码后数据量增加约33%。编码定义再RFC1ll3种“Privaly Enhanced Mail Application”部分(htp:/202.38.79.17/cgi-bin/rfc/2.pl?FNAME=1113)。基64编码使用65个 ASCI字符,每个字符代表6BIT的数据。即被编码的数据以24BT(3个字节)为单位, 这24BT被分成4个部分,每个部分对应一个ASCI字符,具体BIT和字符的对应关系如 下表所示。当编码行末尾不足24BT时,以“=”填充。 Value Encoding Value Encoding Value Encoding Value Encoding 0A 17R 34i 51z 1B 18S 35j 520 2C 19T 36k 531 3D 20U 371 542 4E 21V 38m 553 5F 22W 39n 564 6G 23X 400 575 7H 24Y 41p 586 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.cdu.cn cxh@ustc.edu.cn
中国科学技术大学 多媒体技术与网络通信实验室(copyright 1999) 很不方便。目前完成这种格式转换的软件有:uuencode,3/4 基 64 编码法(3/4 Base64 Encoding),及 ATK 编码(Andrew Toolkit Representation)等。 在 RFC1251 是对 RFC822 电子邮件标准的多媒体扩展。RFC1251 主要内容有:再信头 引入 MIME 版本域(MIME Version Field)、内容类型域(Content-Type Field)、转换编码域 ( Content-Transfer-Encoding Field )、 内 容标识 符 ( Content-ID ) 和 内 容 描 述 符 (Content-Description)。以下为一个简单的示例: From:Fool@belle.eeis.ustc.edu.cn //源地址:Fool@belle.eeis.ustc.edu.cn To:Wise@ belle.eeis.ustc.edu.cn //目的地址:Wise@ belle.eeis.ustc.edu.cn Subject:Mail Example //邮件主题 Message-ID:Big Fool //发送者标识 MIME-Version:1.0 //MIME 版本号 Content-Type:IMAGE/BMP //邮件为 BMP 画图格式 Content-Transfer-Encoding: BASE64 //邮件用 3/4 基 64 编码法编码 Content-ID:MsgFirst //消息的标识 Content-Description:Fool to Wise //消息的简要说明 其中内容标识符(Content-ID)和内容描述符(Content-Description)是可选的。内容类 型域( Content-Type Field )声明 传 送 媒 体 的类型 和 子 类 型 、 转换编 码 域 (Content-Transfer-Encoding Field)声明邮件的编码方式。 三、编码方法 “转换编码域”可选择的编码方法最常用的有两种:Quoted-Printable 编码法(适用于 含有大量 7BIT 字符的数据)、3/4 基 64 编码法(适用于二进制数据)。 Quoted-Printable 编码法基本规则是:被编码的数据以 8BIT 的字节为单位,每个字节用 等号“=”和其十六进制形式表示,如值 12 的编码是“=0C”;但如果被编码的是可打印的 字符,就用本生 7BIT 的 ASCII 字符表示,如 a 的编码是“a”。用这种编码方法编码的数据 的可读性是比较强的。 3/4 基 64 编码法(3/4 Base64 Encoding)适用于不可读的二进制文件。编码、解码都比 较简单,编码后数据量增加约 33%。编码定义再 RFC1113 种“Privaly Enhanced Mail Application”部分(http://202.38.79.17/cgi-bin/rfc/2.pl?FNAME=1113)。基 64 编码使用 65 个 ASCII 字符,每个字符代表 6BIT 的数据。即被编码的数据以 24BIT(3 个字节)为单位, 这 24BIT 被分成 4 个部分,每个部分对应一个 ASCII 字符,具体 BIT 和字符的对应关系如 下表所示。当编码行末尾不足 24BIT 时,以“=”填充。 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 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系 network@ustc.edu.cn cxh@ustc.edu.cn
中国科学技术大学 多媒体技术与网络通信实验室(copyright1999) 8I 25Z 42q 597 9J 26a 43r 608 10K 27b 44s 619 11L 28c 45t 62+ 12M 29d 46u 63/ 13N 30e 47v 140 31f 48w (pad)= 15P 32g 49x 16Q 33h 50y (1)* 四、基64编码的实现示例 用C语言编制编码程序示例。将一个输入的二进制文件进行基64编码的实现。 ∥定义转换码表BASE64[64] char BASE64164A,B,'CDE,F'G,H TJ,KL,M N,'OPQRS,T UVWXYZ, 'a,b,'c,d,c,f,'g,h,i,j,k,T,'m,'n,o,p,q,r,'s,t,u,v,w,x,y,z, 0,1',2,3,4,'5,6,7,8,9,+,} FILE *in,*out; /输入输出文件的指针 Int TotalInChar: /输入文件的总字符数 for(i=0;i>18: fputc(BASE64[OutChar],out); OutChar =(ConvertChar >12)&MASK; fputc(BASE64[OutChar],out); OutChar =(ConvertChar >>6)&MASK; fputc(BASE64[OutChar],out); OutChar ConvertChar MASK: fputc(BASE64[OutChar],out); if(TotalInChar%3==1){ InChar fgetc(in); ConvertChar=InChar, ConvertChar ConvertChar >6)&MASK; 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.cdu.cn cxh@ustc.cdu.cn
中国科学技术大学 多媒体技术与网络通信实验室(copyright 1999) 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 (1) * 四、基 64 编码的实现示例 用 C 语言编制编码程序示例。将一个输入的二进制文件进行基 64 编码的实现。 //定义转换码表 BASE64[64] char BASE64[64]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+','/'}; FILE *in, *out; //输入输出文件的指针 Int TotalInChar; //输入文件的总字符数 for(i=0;i> 18; fputc(BASE64[OutChar], out); OutChar = (ConvertChar >> 12) & MASK; fputc(BASE64[OutChar], out); OutChar = (ConvertChar >> 6) & MASK; fputc(BASE64[OutChar], out); OutChar = ConvertChar & MASK; fputc(BASE64[OutChar], out); } if(TotalInChar%3 == 1){ InChar = fgetc(in); ConvertChar = InChar; ConvertChar = ConvertChar > 6) & MASK; 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系 network@ustc.edu.cn cxh@ustc.edu.cn
中国科学技术大学 多媒体技术与网络通信实验室(copyright1999) fputc(BASE64[OutChar],out); OutChar ConvertChar MASK: fputc(BASE64[OutChar],out); fputc('=,out); fputc('=,out); if(TotalInChar%3==2){ InChar fgetc(in); ConvertChar InChar: InChar fgetc(in): ConvertChar ConvertChar 12)&MASK; fputc(BASE64[OutChar],out); OutChar=(ConvertChar >>6)&MASK: fputc(BASE64[OutChar],out); OutChar ConvertChar MASK: fputc(BASE64[OutChar],out); fputc(=,out); 参考文献 【1】 赫杰,吴元清,郑榕等著,使用多媒体技术及其C语言实现,北京:电子工业出版社,1995.4 【2】 http://202.38.79.17/cgi-bin/rfc/2.pl?FNAME=2110 【3】 http://202.38.79.17/cgi-bin/rfc/2.pl?FNAME=1113 【4】 http://202.38.79.17/cgi-bin/rfc/2.pl?FNAME=1844 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.cdu.cn cxh@ustc.cdu.cn
中国科学技术大学 多媒体技术与网络通信实验室(copyright 1999) fputc(BASE64[OutChar], out); OutChar = ConvertChar & MASK; fputc(BASE64[OutChar], out); fputc('=', out); fputc('=', out); } if(TotalInChar%3 == 2){ InChar = fgetc(in); ConvertChar = InChar; InChar = fgetc(in); ConvertChar = ConvertChar > 12) & MASK; fputc(BASE64[OutChar], out); OutChar = (ConvertChar >> 6) & MASK; fputc(BASE64[OutChar], out); OutChar = ConvertChar & MASK; fputc(BASE64[OutChar], out); fputc('=', out); } 参考文献 【1】 赫杰,吴元清,郑榕等著,使用多媒体技术及其 C 语言实现,北京:电子工业出版社,1995.4 【2】 http://202.38.79.17/cgi-bin/rfc/2.pl?FNAME=2110 【3】 http://202.38.79.17/cgi-bin/rfc/2.pl?FNAME=1113 【4】 http://202.38.79.17/cgi-bin/rfc/2.pl?FNAME=1844 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系 network@ustc.edu.cn cxh@ustc.edu.cn