﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-心無雜念的空白-文章分类-协议分析</title><link>http://www.cppblog.com/lshain/category/17430.html</link><description>Beyond this world...</description><language>zh-cn</language><lastBuildDate>Sat, 27 Aug 2011 06:21:50 GMT</lastBuildDate><pubDate>Sat, 27 Aug 2011 06:21:50 GMT</pubDate><ttl>60</ttl><item><title>BASE64编解码</title><link>http://www.cppblog.com/lshain/articles/152245.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Mon, 01 Aug 2011 15:31:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/152245.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Base64要求把每三个8Bit的字节转换为四个6Bit的字节（3*8 = 4*6 = 24），然后把6Bit再添两位高位0，组成四个8Bit的字节。<br /><br />Code:<br /><br />
<p>#define&nbsp;&nbsp;UNDEFINE_BASE64_DECODECHAR&nbsp;&nbsp;(0xFF)<br />#define&nbsp;&nbsp;_BAD&nbsp;&nbsp;UNDEFINE_BASE64_DECODECHAR</p>
<p>const unsigned char Base64_EncodeTable[] = <br />"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";</p>
<p>const unsigned char Base64_DecodeTable[128] = {<br />&nbsp;_BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD, <br />&nbsp;_BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD, <br />&nbsp;_BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD,<br />&nbsp;_BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD,<br />&nbsp;_BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD,<br />&nbsp;_BAD, _BAD, _BAD, 0x3E, _BAD, _BAD, _BAD, 0x3F,<br />&nbsp;0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,<br />&nbsp;0x3C, 0x3D, _BAD, _BAD, _BAD, 0x00, _BAD, _BAD,<br />&nbsp;_BAD, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,<br />&nbsp;0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,<br />&nbsp;0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,<br />&nbsp;0x17, 0x18, 0x19, _BAD, _BAD, _BAD, _BAD, _BAD,<br />&nbsp;_BAD, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,<br />&nbsp;0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,<br />&nbsp;0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,<br />&nbsp;0x31, 0x32, 0x33, _BAD, _BAD, _BAD, _BAD, _BAD<br />};</p>
<p>int Base64_Encode(unsigned char* pSStr, unsigned char* pDStr)<br />{<br />&nbsp;&nbsp;&nbsp;int len = (int)strlen(reinterpret_cast&lt;const char*&gt;(pSStr));<br />&nbsp;&nbsp;&nbsp;int equ_num = len%3;<br />&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;int dStrLen = 0;<br />&nbsp;&nbsp;&nbsp;for(i = 0, dStrLen = 0; i &lt;= len - 3; i += 3, dStrLen += 4){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[dStrLen] = (pSStr[i]&gt;&gt;2)&amp;0x3F;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[dStrLen + 1] = (((pSStr[i]&lt;&lt;6)&gt;&gt;2)&amp;0x30)|((pSStr[i + 1]&gt;&gt;4)&amp;0x0F);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[dStrLen + 2] = (((pSStr[i + 1]&lt;&lt;4)&gt;&gt;2)&amp;0x3C)|((pSStr[i + 2]&gt;&gt;6)&amp;0x03);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[dStrLen + 3] = pSStr[i + 2]&amp;0x3F;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;if(0 != equ_num){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char ch1 = ((2 == equ_num) ? pSStr[len - 2] : pSStr[len - 1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char ch2 = ((2 == equ_num) ? pSStr[len - 1] : 0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[dStrLen++] = (ch1&gt;&gt;2)&amp;0x3F;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[dStrLen++] = (((ch1&lt;&lt;6)&gt;&gt;2)&amp;0x30)|((ch2&gt;&gt;4)&amp;0x0F);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(0 != ch2){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[dStrLen++] = ((ch2&lt;&lt;4)&gt;&gt;2)&amp;0x3C;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; dStrLen; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[i] = Base64_EncodeTable[pDStr[i]];<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;if(0 != equ_num){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(1 == equ_num){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[dStrLen++] = '=';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[dStrLen++] = '=';<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;pDStr[dStrLen] = 0;<br />&nbsp;&nbsp;&nbsp;return dStrLen;<br />}<br /></p>
<p>int Base64_Decode(unsigned char* pSStr, unsigned char* pDStr)<br />{<br />&nbsp;&nbsp;&nbsp;int len = (int)strlen(reinterpret_cast&lt;const char*&gt;(pSStr));<br />&nbsp;&nbsp;&nbsp;int dStrLen = 0;<br />&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;unsigned char ch1 = 0;<br />&nbsp;&nbsp;&nbsp;unsigned char ch2 = 0;<br />&nbsp;&nbsp;&nbsp;unsigned char ch3 = 0;<br />&nbsp;&nbsp;&nbsp;unsigned char ch4 = 0;<br />&nbsp;&nbsp;&nbsp;for(i = 0, dStrLen = 0; i &lt; len; i += 4, dStrLen += 3){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch1 = Base64_DecodeTable[pSStr[i]];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch2 = Base64_DecodeTable[pSStr[i + 1]];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch3 = Base64_DecodeTable[pSStr[i + 2]];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch4 = Base64_DecodeTable[pSStr[i + 3]];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDStr[dStrLen] = ((ch1&lt;&lt;2)&amp;0xFC)|((ch2&gt;&gt;4)&amp;0x03);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[dStrLen + 1] = ((ch2&lt;&lt;4)&amp;0xF0)|((ch3&gt;&gt;2)&amp;0x0F);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDStr[dStrLen + 2] = ((ch3&lt;&lt;6)&amp;0xC0)|(ch4&amp;0x3F);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;pDStr[dStrLen] = 0;<br />&nbsp;&nbsp;&nbsp;return dStrLen;<br />}<br /></p>   <img src ="http://www.cppblog.com/lshain/aggbug/152245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshain/" target="_blank">Lshain</a> 2011-08-01 23:31 <a href="http://www.cppblog.com/lshain/articles/152245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>协议分析 记录</title><link>http://www.cppblog.com/lshain/articles/152039.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Fri, 29 Jul 2011 07:13:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/152039.html</guid><description><![CDATA[<div>rfc 2616 -&gt; http1.1<br />rfc 1867 -&gt; 文件上传</div>    <img src ="http://www.cppblog.com/lshain/aggbug/152039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshain/" target="_blank">Lshain</a> 2011-07-29 15:13 <a href="http://www.cppblog.com/lshain/articles/152039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>