Base64编码技术  |
Base64简介在RFC2045(http://www.ietf.org/rfc/rfc2045.txt)中Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)字面上的意思就是把要传送的内容简单的加密,不能让人直接识别。RFC2045其实就是Multipurpose Internet Mail Extensions,base64就是用来简单加密邮件内容的。base64产生的原因还有一个就是,在Email的传送过程中,由于历史原因,Email只被允许传送ASCII字符,即一个8位字节的低7位。因此,如果您发送了一封带有非ASCII字符(即字节的最高位是1)的Email通过有“历史问题”的网关时就可能会出现问题。网关可能会把最高位置为0!由于以上原因,产生了Base64编码。Base64编码的应用首先,在E-Mail中,编码都是base64编码.随便用文本编辑器打开一封邮件,是eml为扩展名的,都可以看到如下内容:Content-Type: text/html; charset="gb2312"Content-Transfer-Encoding: base64电子邮件中的内容都是用base64处理过的.然后就是在文件的保存中base64也有应用。举个例子,在浏览器中输入www.baidu.com,回车,网页打开以后,选"文件""另存为",在"保存类型"中选"Web 档案,单一文件(*.mht)"然后点"保存"。保存后的文件,如果在浏览器中打开,像普通的网页一样,包括文字 图片等很多文件。那么程序内部是如何实现的,把很多个文件保存到一个文件中那?你现在可以在记事本中把刚才保存的文件打开,文件的最后你可以看到如下内容: Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://gimg.baidu.com/img/gs.gif
R0lGODlhDwARAJEAAP///9vb27a2tgAAACwAAAAADwARAAACNISPqcJ6DGFYMaYKsGEBZl0Jn5UF 5ok2GXAaqTiKnudyFr1NHVci+y7YUUIwH9GxISFHigIAOw==gs.gif是个图片 下面的内容就是它的base64编码,也就是说网页保存的时候,是通过base64编码把很多文件保存到同一个文件中的。源代码我们现在看看base64.c的源代码。打开以后你会发现里面有8个函数: long b64dlen(size_t cch); long b64elen(size_t cb); long strb64d(const char * psz,size_t cch, void * p); long strb64e(const void * p,size_t cb,char * psz); int strisb64(const char * psz,size_t cch); long wcsb64d(const wchar_t * psz, size_t cch, void * p); long wcsb64e(const void * p, size_t cb, wchar_t * psz); int wcsisb64(const wchar_t * psz,size_t cch);作用: b64dlen base64解码以后的长度 b64elen base64编码以后的长度 strb64d 把base64编码以后的字符串,转换成为二进制数据 strb64e 把二进制数据转化为base64编码 strisb64 确定是不是有效的base64编码 wcsb64d 功能和strb64d一样,数据类型不同 wcsb64e 功能和strb64e一样,数据类型不同 wcsisb64 功能和strisb64一样,数据类型不同函数的使用例如加密文件:void Base64EncodeFile (char* filename){ FILE *RFile; FILE *WFile; int len; //char *buffer=(char*)malloc(1024); char buffer[1023]; char FileNameBuffer[255]; char EncodeBuffer[2046]; memset(buffer,0,255); memset(FileNameBuffer,0,255); sprintf(FileNameBuffer,"%s.base64",filename); if ((RFile = fopen (filename, "rb")) == NULL){ printf ("Execute Result: %s can't be opened\n", filename); return ; } if ((WFile = fopen (FileNameBuffer, "wb")) == NULL){ printf ("Execute Result: %s can't be opened\n", FileNameBuffer); return ; } printf ("Execute Result: Base64 String Is Stored In %s ", FileNameBuffer); while (len = fread (buffer, 1, 1023, RFile)){ long length=strb64e(buffer,len,EncodeBuffer); fwrite(EncodeBuffer,1,length,WFile); } fclose (RFile); fclose (WFile); return;}
自己写了一个exe,可以到http://bbs.xml.org.cn/dispbbs.asp?boardID=47&ID=38211上下载
|
阅读全文(2696) | 回复(0) | 编辑 | 精华 |
|
|
| « | November 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | | | |
|
| Blog信息 |
|
blog名称: 日志总数:33 评论数量:61 留言数量:-8 访问次数:238004 建立时间:2006年4月27日 | |

|