﻿<?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>语源科技BlogJava-LALA</title><link>http://www.blogjava.net/wenhl5656/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 21:03:30 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 21:03:30 GMT</pubDate><ttl>60</ttl><item><title>pImpl Idiom</title><link>http://www.blogjava.net/wenhl5656/archive/2010/08/07/328217.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Sat, 07 Aug 2010 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2010/08/07/328217.html</guid><description><![CDATA[在读《Effective C++》和项目源代码时，看到pImpl Idiom。它可以用来<font color="#ff0000">降低文件间的编译依赖关系</font>，通过把一个Class分成两个Class，一个只提供接口，另一个负责实现该接口，实现接口与实现的分离。这个分离的关键在于“以声明的依赖性”替换“定义的依赖性”，而编译依赖性最小化的本质是:让头文件尽可能的自我满足，万一做不到，则让它与其他文件内的声明式（而非定义式）相依。<br /><br />引用<a target="_blank" title="这里" href="http://c2.com/cgi/wiki?PimplIdiom">这里</a>的一些描述：<br /><font face="Verdana">The Pimpl idiom, also known as the compilation firewall or Cheshire Cat 
technique, is a "private implementation" technique useful only in <a href="http://c2.com/cgi/wiki?CeePlusPlus">CeePlusPlus</a> and statically compiled languages like it...
</font><br /><font face="Verdana"><br />Benefits:
</font><ol><li><font face="Verdana"> Changing private member variables of a class does not require recompiling classes that depend on it, thus <strong>make</strong> times are faster, and the <a href="http://c2.com/cgi/wiki?FragileBinaryInterfaceProblem">FragileBinaryInterfaceProblem</a> is reduced.
</font></li><li><font face="Verdana"> The header file does not need to #include classes that are used 'by value' in private member variables, thus <strong>compile</strong></font> times are faster.
</li><li><font face="Verdana"> This is sorta like the way <a href="http://c2.com/cgi/wiki?SmallTalk">SmallTalk</a> automatically handles classes... more pure encapsulation.
</font></li></ol><font face="Verdana">
Drawbacks:
</font><ol><li><font face="Verdana"> More work for the implementor.
</font></li><li><font face="Verdana"> Doesn't work for 'protected' members where access by subclasses is required.
</font></li><li><font face="Verdana"> Somewhat harder to read code, since some information is no longer in the header file.
</font></li><li><font face="Verdana"> Run-time performance is slightly compromised due to the 
pointer indirection, especially if function calls are virtual (branch 
prediction for indirect branches is generally poor).
</font></li></ol><font face="Verdana">
How to do it:
</font><ol><li><font face="Verdana"> Put all the private member variables into a struct.
</font></li><li><font face="Verdana"> Put the struct definition in the .cpp file.
</font></li><li><font face="Verdana"> In the header file, put only the <a href="http://c2.com/cgi/wiki?ForwardDeclaration">ForwardDeclaration</a> of the struct.
</font></li><li><font face="Verdana"> In the class definition, declare a (smart) pointer to the struct as the only private member variable.
</font></li><li><font face="Verdana"> The constructors for the class need to create the struct.
</font></li><li><font face="Verdana"> The destructor of the class needs to destroy the struct (possibly implicitly due to use of a smart pointer).
</font></li><li><font face="Verdana"> The assignment operator and <a href="http://c2.com/cgi/wiki?CopyConstructor">CopyConstructor</a> need to copy the struct appropriately or else be disabled.
</font></li></ol><font face="Verdana">Code：</font><font face="Courier New"><br /><div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><font face="Courier New"><span style="color: rgb(0, 128, 128);">1</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">struct</span><span style="color: rgb(0, 0, 0);"> AImp;<br /></span><span style="color: rgb(0, 128, 128);">2</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> A {<br /></span><span style="color: rgb(0, 128, 128);">3</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">:<br /></span><span style="color: rgb(0, 128, 128);">4</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Same public interface as A, but all delegated to concrete implementation.</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">5</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">:<br /></span><span style="color: rgb(0, 128, 128);">6</span> <span style="color: rgb(0, 0, 0);">    AImp </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> pimpl;<br /></span><span style="color: rgb(0, 128, 128);">7</span> <span style="color: rgb(0, 0, 0);">  };<br /></span><span style="color: rgb(0, 128, 128);">8</span> </font><span style="color: rgb(0, 0, 0);"></span></div><br /><br /></font><font face="Verdana">If you use a <a href="http://c2.com/cgi/wiki?SmartPointer">SmartPointer</a>
 and you only have one implementation, there is no need to make any of 
the member functions virtual, except possibly the destructor. The 
run-time cost of non-virtual member function calls is much lower, and a 
compiler that does whole-program optimization can inline them even 
though they're in a separate translation unit. Here's an example:
</font><pre><div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> foo.h</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> foo_impl;<br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> foo {<br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Boilerplate</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">    friend </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> foo_impl;<br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);">    foo() {} </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> so only foo_impl can derive from foo</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> foo_impl </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> impl() </span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">    foo_impl </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> impl();<br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">:<br /></span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">virtual</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">~</span><span style="color: rgb(0, 0, 0);">foo() {}<br /></span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Factories</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> std::auto_ptr</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">foo</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> create(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> value);<br /></span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Interface</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> value() </span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 0, 0);">  };<br /></span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> foo.cpp</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> foo_impl : </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> foo {<br /></span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 0, 0);">    friend </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> foo;<br /></span><span style="color: rgb(0, 128, 128);">23</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Constructors mirroring the factory functions in foo</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">24</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">explicit</span><span style="color: rgb(0, 0, 0);"> foo_impl(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> value) : value_(value) {}<br /></span><span style="color: rgb(0, 128, 128);">25</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> Member data</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">26</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> value_;<br /></span><span style="color: rgb(0, 128, 128);">27</span> <span style="color: rgb(0, 0, 0);">  };<br /></span><span style="color: rgb(0, 128, 128);">28</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">29</span> <span style="color: rgb(0, 0, 0);">  inline </span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> foo_impl </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> foo::impl() </span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> {<br /></span><span style="color: rgb(0, 128, 128);">30</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> static_cast</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> foo_impl </span><span style="color: rgb(0, 0, 0);">*&gt;</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">31</span> <span style="color: rgb(0, 0, 0);">  }<br /></span><span style="color: rgb(0, 128, 128);">32</span> <span style="color: rgb(0, 0, 0);">  inline foo_impl </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> foo::impl() {<br /></span><span style="color: rgb(0, 128, 128);">33</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> static_cast</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">foo_impl </span><span style="color: rgb(0, 0, 0);">*&gt;</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">34</span> <span style="color: rgb(0, 0, 0);">  }<br /></span><span style="color: rgb(0, 128, 128);">35</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">36</span> <span style="color: rgb(0, 0, 0);">  std::auto_ptr</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">foo</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> foo::create(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> value) {<br /></span><span style="color: rgb(0, 128, 128);">37</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> std::auto_ptr</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">foo</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> foo_impl(value));<br /></span><span style="color: rgb(0, 128, 128);">38</span> <span style="color: rgb(0, 0, 0);">  }<br /></span><span style="color: rgb(0, 128, 128);">39</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">40</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> foo::value() </span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> { </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> impl()</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">value_; }<br /></span><span style="color: rgb(0, 128, 128);">41</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">42</span> <span style="color: rgb(0, 0, 0);"></span></div><br /></pre><font face="Verdana">Here, the destructor needs to be declared virtual foo so that 
std::auto_ptr&lt;foo&gt; calls foo_impl's destructor. If you use 
boost::shared_ptr&lt;foo&gt; instead, even that doesn't need to be 
virtual, because shared_ptr remembers how to call the correct 
destructor. (This doesn't improve performance or memory use, because 
shared_ptr is larger and slower than auto_ptr, but if you need to use 
shared_ptr anyway you may as well eliminate the virtual destructor.) -- <a href="http://c2.com/cgi/wiki?BenHutchings">BenHutchings</a></font><br /><br /><br />参考阅读：<br /><br />Effective C++<br />http://c2.com/cgi/wiki?PimplIdiom<br />http://en.wikipedia.org/wiki/Opaque_pointer<br /><img src ="http://www.blogjava.net/wenhl5656/aggbug/328217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2010-08-07 22:58 <a href="http://www.blogjava.net/wenhl5656/archive/2010/08/07/328217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Effective C++ -  09.绝对不要在构造和析构过程中调用虚函数</title><link>http://www.blogjava.net/wenhl5656/archive/2010/07/28/327365.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Wed, 28 Jul 2010 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2010/07/28/327365.html</guid><description><![CDATA[
		<font face="Verdana">要点：绝对不应该在构造函数和析构函数中调用虚函数。<br /><br />Derived Class对象内的Base Class成分会在Derived Class自身成分被构造之前构造完成。如果Base Class构造函数中有虚函数（virtual function），该virtual function绝对不会下降到Derived Class层中，而是直接调用Base Class中该函数，通俗的说，即——在Base Class构造时，virtual function不再被当成virtual function。<br /><br />这是因为，在Base Class构造期间，对象的类型是Base Class而不是Derived Class。不只是虚函数会被编译器解析至Base Class中，若使用运行期类信息（runtime type information，例如dynamic_cast和typeid），也会把对象视为Base Class类型。同样这也适合于析构函数。一旦由Derived Class的析构函数进入到BaseClass的析构函数后，对象就成为一个BaseClass的对象了。<br /></font>
<img src ="http://www.blogjava.net/wenhl5656/aggbug/327365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2010-07-28 21:37 <a href="http://www.blogjava.net/wenhl5656/archive/2010/07/28/327365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>找出数组中最大的K个数</title><link>http://www.blogjava.net/wenhl5656/archive/2010/01/20/310228.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Wed, 20 Jan 2010 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2010/01/20/310228.html</guid><description><![CDATA[用的是随机算法。<br />C代码：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">stdio.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">stdlib.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> new_random(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> min, </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> max)<br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> (min </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">)(((</span><span style="color: rgb(0, 0, 255);">float</span><span style="color: rgb(0, 0, 0);">)rand()</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">RAND_MAX)</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">(max </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> min)));<br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);">}<br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> swap(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">a, </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">b)<br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> c </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">a;<br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">a </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">b;<br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">b </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> c;<br /></span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);">}<br /></span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> partition(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> A[], </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> p, </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> r)<br /></span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> p </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">, j;<br /></span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(j </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> p; j </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> r; j</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 0, 0);">    {<br /></span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(A[j] </span><span style="color: rgb(0, 0, 0);">&lt;=</span><span style="color: rgb(0, 0, 0);"> A[r])<br /></span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 0, 0);">        {<br /></span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 0, 0);">            i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 0, 0);">            swap(</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">A[i], </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">A[j]);<br /></span><span style="color: rgb(0, 128, 128);">23</span> <span style="color: rgb(0, 0, 0);">        }<br /></span><span style="color: rgb(0, 128, 128);">24</span> <span style="color: rgb(0, 0, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);">25</span> <span style="color: rgb(0, 0, 0);">    swap(</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">A[i </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">], </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">A[r]);<br /></span><span style="color: rgb(0, 128, 128);">26</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">27</span> <span style="color: rgb(0, 0, 0);">}<br /></span><span style="color: rgb(0, 128, 128);">28</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">29</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> randomize_partition(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> A[], </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> p, </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> r)<br /></span><span style="color: rgb(0, 128, 128);">30</span> <span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);">31</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> new_random(p, r);<br /></span><span style="color: rgb(0, 128, 128);">32</span> <span style="color: rgb(0, 0, 0);">    swap(</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">A[i], </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">A[r]);<br /></span><span style="color: rgb(0, 128, 128);">33</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> partition(A, p, r);<br /></span><span style="color: rgb(0, 128, 128);">34</span> <span style="color: rgb(0, 0, 0);">}<br /></span><span style="color: rgb(0, 128, 128);">35</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">36</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">第一种算法</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">37</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> randomized_select(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> data[], </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> p, </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> r, </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> k)<br /></span><span style="color: rgb(0, 128, 128);">38</span> <span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);">39</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(k </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> (r </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> p </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)) </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">40</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(p </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> r) </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> data[p];<br /></span><span style="color: rgb(0, 128, 128);">41</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> randomize_partition(data, p, r);<br /></span><span style="color: rgb(0, 128, 128);">42</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">int i = partition(data, p, r); </span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">43</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">44</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> count </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> p </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">45</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(k </span><span style="color: rgb(0, 0, 0);">&lt;=</span><span style="color: rgb(0, 0, 0);"> count)<br /></span><span style="color: rgb(0, 128, 128);">46</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> randomized_select(data, p, i, k);<br /></span><span style="color: rgb(0, 128, 128);">47</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">48</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> randomized_select(data, i </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">, r, k </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> count);<br /></span><span style="color: rgb(0, 128, 128);">49</span> <span style="color: rgb(0, 0, 0);">} </span></div><br />Java代码：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> algorithm;<br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.ArrayList;<br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.Collections;<br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.List;<br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.Random;<br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> FindKth {<br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> Random rand </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Random();<br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 128, 0);">     * Find the K-th smallest number in a list using random algorithm<br /></span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 128, 0);">     * <br /></span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 128, 0);">     * </span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);"> the k-th smallest number<br /></span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 128, 0);">     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> selectKth(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[] arr, </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> k) {<br /></span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> low </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> high </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> arr.length </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> m;<br /></span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 0, 0);">        k </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> k </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);"> (low </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> high) {<br /></span><span style="color: rgb(0, 128, 128);">23</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> r </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> low </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> rand.nextInt(high </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> low </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">24</span> <span style="color: rgb(0, 0, 0);">            swap(arr, low, r);<br /></span><span style="color: rgb(0, 128, 128);">25</span> <span style="color: rgb(0, 0, 0);">            m </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> low;<br /></span><span style="color: rgb(0, 128, 128);">26</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> low </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">; i </span><span style="color: rgb(0, 0, 0);">&lt;=</span><span style="color: rgb(0, 0, 0);"> high; i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">27</span> <span style="color: rgb(0, 0, 0);">                </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (arr[i] </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> arr[low])<br /></span><span style="color: rgb(0, 128, 128);">28</span> <span style="color: rgb(0, 0, 0);">                    swap(arr, </span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">m, i);<br /></span><span style="color: rgb(0, 128, 128);">29</span> <span style="color: rgb(0, 0, 0);">            swap(arr, low, m);<br /></span><span style="color: rgb(0, 128, 128);">30</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (m </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> k)<br /></span><span style="color: rgb(0, 128, 128);">31</span> <span style="color: rgb(0, 0, 0);">                </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> arr[k];<br /></span><span style="color: rgb(0, 128, 128);">32</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (m </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> k)<br /></span><span style="color: rgb(0, 128, 128);">33</span> <span style="color: rgb(0, 0, 0);">                low </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> m </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">34</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">35</span> <span style="color: rgb(0, 0, 0);">                high </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> m </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">36</span> <span style="color: rgb(0, 0, 0);">        }<br /></span><span style="color: rgb(0, 128, 128);">37</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">38</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> arr[k];<br /></span><span style="color: rgb(0, 128, 128);">39</span> <span style="color: rgb(0, 0, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);">40</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">41</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> selectKth(Integer[] arr, </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> k) {<br /></span><span style="color: rgb(0, 128, 128);">42</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[] array </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[arr.length];<br /></span><span style="color: rgb(0, 128, 128);">43</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">; i </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> arr.length; i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">44</span> <span style="color: rgb(0, 0, 0);">            array[i] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> arr[i];<br /></span><span style="color: rgb(0, 128, 128);">45</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> selectKth(array, k);<br /></span><span style="color: rgb(0, 128, 128);">46</span> <span style="color: rgb(0, 0, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);">47</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">48</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> swap(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[] arr, </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> low, </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> r) {<br /></span><span style="color: rgb(0, 128, 128);">49</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> tmp </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> arr[low];<br /></span><span style="color: rgb(0, 128, 128);">50</span> <span style="color: rgb(0, 0, 0);">        arr[low] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> arr[r];<br /></span><span style="color: rgb(0, 128, 128);">51</span> <span style="color: rgb(0, 0, 0);">        arr[r] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> tmp;<br /></span><span style="color: rgb(0, 128, 128);">52</span> <span style="color: rgb(0, 0, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);">53</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">54</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">55</span> <span style="color: rgb(0, 128, 0);">     * </span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);"> args<br /></span><span style="color: rgb(0, 128, 128);">56</span> <span style="color: rgb(0, 128, 0);">     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">57</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> main(String[] args) {<br /></span><span style="color: rgb(0, 128, 128);">58</span> <span style="color: rgb(0, 0, 0);">        List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Integer</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> list </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ArrayList</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Integer</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">();<br /></span><span style="color: rgb(0, 128, 128);">59</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">; i </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">; i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">60</span> <span style="color: rgb(0, 0, 0);">            list.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Integer(i </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">));<br /></span><span style="color: rgb(0, 128, 128);">61</span> <span style="color: rgb(0, 0, 0);">        Integer[] arr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Integer[list.size()];<br /></span><span style="color: rgb(0, 128, 128);">62</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> loop </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">; loop </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1000</span><span style="color: rgb(0, 0, 0);">; loop</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">) {<br /></span><span style="color: rgb(0, 128, 128);">63</span> <span style="color: rgb(0, 0, 0);">            Collections.shuffle(list);<br /></span><span style="color: rgb(0, 128, 128);">64</span> <span style="color: rgb(0, 0, 0);">            list.toArray(arr);<br /></span><span style="color: rgb(0, 128, 128);">65</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> res </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> selectKth(arr, </span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">66</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (res </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">67</span> <span style="color: rgb(0, 0, 0);">                System.out.println(loop </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> res);<br /></span><span style="color: rgb(0, 128, 128);">68</span> <span style="color: rgb(0, 0, 0);">        }<br /></span><span style="color: rgb(0, 128, 128);">69</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">70</span> <span style="color: rgb(0, 0, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);">71</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">72</span> <span style="color: rgb(0, 0, 0);">}<br /></span><span style="color: rgb(0, 128, 128);">73</span> <span style="color: rgb(0, 0, 0);"></span></div><br />Python代码：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">!/usr/bin/env python</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> random </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> randint<br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> finding the kth smallest number in a list</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);"> select(list, k):<br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);">    low </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> 0<br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);">    up </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> len(list) </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);">    k </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> k </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(low </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> up):<br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">        rand </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> randint(low, up)<br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);">        list[low], list[rand] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> list[rand], list[low] </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">swap</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        m </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> low<br /></span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 0, 0);">        tmp </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> list[low]<br /></span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 255);">in</span><span style="color: rgb(0, 0, 0);"> xrange(low </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">, up </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">):<br /></span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> list[i] </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> tmp:<br /></span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 0, 0);">                m </span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 0, 0);">                list[m], list[i] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> list[i], list[m] </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> swap</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        list[m], list[low] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> list[low], list[m]<br /></span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> m </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> k:<br /></span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list[k]<br /></span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">elif</span><span style="color: rgb(0, 0, 0);"> m </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> k:<br /></span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 0, 0);">            low </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> m </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">23</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">elif</span><span style="color: rgb(0, 0, 0);"> m </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> k:<br /></span><span style="color: rgb(0, 128, 128);">24</span> <span style="color: rgb(0, 0, 0);">            up </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> m </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">  <br /></span><span style="color: rgb(0, 128, 128);">25</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> list[k]<br /></span><span style="color: rgb(0, 128, 128);">26</span> <span style="color: rgb(0, 0, 0);">    <br /></span><span style="color: rgb(0, 128, 128);">27</span> <span style="color: rgb(0, 0, 0);">    <br /></span><span style="color: rgb(0, 128, 128);">28</span> <span style="color: rgb(0, 0, 0);">x </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> range(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">11</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">29</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> random </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> shuffle<br /></span><span style="color: rgb(0, 128, 128);">30</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 255);">in</span><span style="color: rgb(0, 0, 0);"> range(</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">):<br /></span><span style="color: rgb(0, 128, 128);">31</span> <span style="color: rgb(0, 0, 0);">    shuffle(x)<br /></span><span style="color: rgb(0, 128, 128);">32</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">print</span><span style="color: rgb(0, 0, 0);"> select(x, </span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);">)</span></div><br /><br /><br /><img src ="http://www.blogjava.net/wenhl5656/aggbug/310228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2010-01-20 14:05 <a href="http://www.blogjava.net/wenhl5656/archive/2010/01/20/310228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux中进程如何成为守护进程</title><link>http://www.blogjava.net/wenhl5656/archive/2009/12/11/305533.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Fri, 11 Dec 2009 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/12/11/305533.html</guid><description><![CDATA[<div>&nbsp;&nbsp;&nbsp; 守护进程运行在后台,不与任何控制终端相关联.守护进程以root用户运行或者其他特殊的用户,并处理一些系统级的任务, 习惯上守护进程的名字以d结尾,但不是必须的.</div>
<div>&nbsp;&nbsp;&nbsp; 对守护进程的两个基本要求: 它必须是init进程的子进程; 不与任何控制终端相关联.</div>
<div>&nbsp;&nbsp;&nbsp; 一般来讲, 进程可以通过以下步骤成为守护进程:</div>
<blockquote>
<div>1. 调用fork(), 创建新的进程, 它会是将来的守护进程.</div>
<div>2. 在守护进程的父进程中调用exit(). 这保证祖父进程(守护进程的祖父进程)确认父进程已经结束. 还保证父进程不再继续运行, 守护进程不是组长进程. 最后一点是顺利完成一下步骤的前提.</div>
<div>3. 调用setsid(), 使得守护进程有一个新的进程组和新的会话, 两者都把它作为首进程, 这也保证它不会与控制终端相关联.</div>
<div>4. 用chdir()将当前工作目录改为根目录. 因为前面调用fork()创建了新进程, 它所继承来的当前工作目录可能在文件系统的任何地方. 而守护进程通常在系统启动时运行, 同时不希望一些随机目录保持打开状态, 也就阻止了管理员卸载守护进程工作目录所在的那个文件系统.</div>
<div>5. 关闭所有的文件描述符. 不需要继承任何打开的文件描述符, 对于无法确认的文件描述符, 让它们继续处于打开状态.</div>
<div>6. 打开0, 1和2号文件描述符(标准输入, 标准输出和标准错误), 把它们重定向到/dev/null.</div>
</blockquote>
<div>根据这些规则, 下面程序可以成为守护进程:</div>
<div>
<div style="padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">#include</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">sys</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">types.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">#include</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">sys</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">stat.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">#include</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">stdlib.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">#include</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">stdio.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">#include</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">fcntl.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">#include</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">unistd.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">#include</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">linux</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">fs.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;main(</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;pid_t&nbsp;pid;<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i;<br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;create&nbsp;new&nbsp;process&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;pid&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;fork();<br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(pid&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(pid&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">)&nbsp;exit(EXIT_SUCCESS);<br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;create&nbsp;new&nbsp;session&nbsp;and&nbsp;process&nbsp;group&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(setsid()&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;set&nbsp;the&nbsp;working&nbsp;directory&nbsp;to&nbsp;the&nbsp;root&nbsp;directory</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(chdir(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;close&nbsp;all&nbsp;open&nbsp;files&nbsp;--&nbsp;NR_OPEN&nbsp;is&nbsp;overkill,&nbsp;but&nbsp;works&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;NR_OPEN;&nbsp;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)&nbsp;close(i);<br />
</span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;redirect&nbsp;fd's&nbsp;0,&nbsp;1,&nbsp;2&nbsp;to&nbsp;/dev/null&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;open(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/dev/null</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;O_RDWR);&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;stdin&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;dup(</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;stdout&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;dup(</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;stderr&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;do&nbsp;it&nbsp;daemon&nbsp;thing<img src="http://www.blogjava.net/Images/dot.gif" alt="" />.</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">28</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">30</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
</div>
<div><br />
</div>
<div>许多Unix系统在它们的C函数库中提供了daemon()函数来完成这些工作:</div>
<div><span class="Apple-tab-span" style="white-space: pre;"> </span>#include &lt;unistd.h&gt;</div>
<div><span class="Apple-tab-span" style="white-space: pre;"> </span>int daemon(int nochdir, int noclose);</div>
<div><br />
</div>
<img src ="http://www.blogjava.net/wenhl5656/aggbug/305533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-12-11 11:33 <a href="http://www.blogjava.net/wenhl5656/archive/2009/12/11/305533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两个已排序链表的合并</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/21/283442.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Sun, 21 Jun 2009 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/21/283442.html</guid><description><![CDATA[<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">typedef&nbsp;</span><span style="color: rgb(0, 0, 255);">struct</span><span style="color: rgb(0, 0, 0);">&nbsp;Node{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;data;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">struct</span><span style="color: rgb(0, 0, 0);">&nbsp;Node</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;next;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">}Node,&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">LinkList;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;Merge(LinkList&nbsp;la,&nbsp;LinkList&nbsp;lb,&nbsp;LinkList </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">lc)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;NULL检测</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">la)&nbsp;{lc&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;pb;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">lb)&nbsp;{lc&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;pa;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">;}<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;Node</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;p;<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;确定最大值在la上,&nbsp;还是lb上</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(la.data&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;lb.data)&nbsp;{&nbsp;lc&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la;&nbsp;la&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;{&nbsp;lc&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb;&nbsp;lb&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(la&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">lb)<br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(la.data&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;lb.data)<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la;<br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;la&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;<br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(la.data&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;lb.data)<br />
</span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb;<br />
</span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lb&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;<br />
</span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">{&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;la&nbsp;与&nbsp;lb中值相等的情况</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la;<br />
</span><span style="color: rgb(0, 128, 128);">28</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;la&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;la</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;<br />
</span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;tmp&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb;<br />
</span><span style="color: rgb(0, 128, 128);">30</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lb&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;lb</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;<br />
</span><span style="color: rgb(0, 128, 128);">31</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(tmp);<br />
</span><span style="color: rgb(0, 128, 128);">32</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">33</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;p</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next;<br />
</span><span style="color: rgb(0, 128, 128);">34</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">35</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;剩余部分链表的挂接</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">36</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">next&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(la&nbsp;</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);">&nbsp;la:lb);<br />
</span><span style="color: rgb(0, 128, 128);">37</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<img src ="http://www.blogjava.net/wenhl5656/aggbug/283442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-06-21 12:02 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/21/283442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(面试题)利用栈将另一个已排序栈中元素反排序</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/21/283424.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Sat, 20 Jun 2009 17:04:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/21/283424.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有两个相同的栈，一个里面放着自大到小排列的数，栈顶的数最小，另一个栈是空的.<br>不允许利用其它的数据结构，只能利用这两个栈，要求把第一个栈里的数字反过来，从<br>小到大排列，结果还放在原来的那个栈里面。&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2009/06/21/283424.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/283424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-06-21 01:04 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/21/283424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单元测试(转摘)</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/17/282924.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Wed, 17 Jun 2009 14:08:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/17/282924.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 单元测试（模块测试）是开发者编写的一小段代码，用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言，一个单元测试是用于判断某个特定条件（或者场景）下某个特定函数的行为。例如，你可能把一个很大的值放入一个有序list 中去，然后确认该值出现在list 的尾部。或者，你可能会从字符串中删除匹配某种模式的字符，然后确认字符串确实不再包含这些字符了。<br><br>    单元测试是由程序员自己来完成，最终受益的也是程序员自己。可以这么说，程序员有责任编写功能代码，同时也就有责任为自己的代码编写单元测试。执行单元测试，就是为了证明这段代码的行为和我们期望的一致。<br><br>    要进行充分的单元测试，应专门编写测试代码，并与产品代码隔离。个人认为，比较简单的办法是为产品工程建立对应的测试工程，为每个类建立对应的测试类，为每个函数（很简单的除外）建立测试函数。&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2009/06/17/282924.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/282924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-06-17 22:08 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/17/282924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试用例设计</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/17/282918.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Wed, 17 Jun 2009 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/17/282918.html</guid><description><![CDATA[<span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="宋体 ">&nbsp;&nbsp;&nbsp; 测试用例就是测试<span href="tag.php?name=%CA%FD%BE%DD" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">数据</span>及与之相关的<span href="tag.php?name=%B9%A6%C4%DC" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">功能</span>的一个特定集合，它是为验证被测试<span href="tag.php?name=%B3%CC%D0%F2" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">程序</span>（为测试程序路径或验证是否符合特定功能等方面的<span href="tag.php?name=%D0%E8%C7%F3" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">需求</span>）而<span href="tag.php?name=%C9%E8%BC%C6" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">设计</span>的。在<span href="tag.php?name=%B5%A5%D4%AA" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">单元</span><strong style="text-align: left; font-style: normal; line-height: normal; font-weight: bold;"><a href="http://www.ltesting.net/html/97/category-catid-97.html" target="_blank" style="text-decoration: none; color: #244d8f; line-height: normal;">测试过程</a></strong>中，测试用例的设计应与复审工作相结合，根据设计的测试用例选取不同的测试数据，将增加发现各类错误的可能性；另外，根据<span href="tag.php?name=%CF%EE%C4%BF" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">项目</span>的具体情况确定测试用例项。如：测试用例编号、用例输入、用例预期输出、被测单元的版本号、实际输出等。单元测试用例的设计既可以使用<span href="tag.php?name=%B0%D7%BA%D0" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">白盒</span>测试也可以使用黑盒测试，但以白盒测试为主，黑盒测试侧重于功能，白盒测试侧重于逻辑。</font></font><br style="line-height: normal;" />
<font style="line-height: normal;" color="black"><font style="line-height: normal;" face="宋体 "><br style="line-height: normal;" />
</font></font><font style="line-height: normal;" face="宋体 "><font style="line-height: normal;" color="#000000">&nbsp;&nbsp;&nbsp; 白盒测试进入的前提条件是测试人员已经对被测试对象有了一定的了解，基本上明确了被测试<span href="tag.php?name=%C8%ED%BC%FE" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">软件</span>的逻辑结构。具体过程就是针对程序逻辑结构设计和加载测试用例，驱动程序执行，<span href="tag.php?name=%BC%EC%B2%E9" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">检查</span>在不同点程序的状态，以确定实际的状态是否与预期的状态一致。</font></font><br style="line-height: normal;" />
<font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman "><br style="line-height: normal;" />
</font><font style="line-height: normal;" face="宋体 ">&nbsp;&nbsp;&nbsp; 一般来说，为了度量测试的完整性，测试工作中通常要求达到一定的覆盖率要求。因为通过覆盖率的统计可以知道测试是否充分，对软件的哪个部分所做的测试不够，指导我们如何设计增加覆盖率的测试用例。这样就能够提高测试<strong style="text-align: left; font-style: normal; line-height: normal; font-weight: bold;"><a href="http://www.ltesting.net/html/5/category-catid-5.html" target="_blank" style="text-decoration: none; color: #244d8f; line-height: normal;"><span href="tag.php?name=%D6%CA%C1%BF" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">质量</span></a></strong>，尽量避免设计无效的用例。</font></font><br style="line-height: normal;" />
<font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman "><br style="line-height: normal;" />
</font><font style="line-height: normal;" face="宋体 ">&nbsp;&nbsp;&nbsp; 在白盒测试的范畴内通常使用下面几种测试覆盖率来度量测试，如：语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖等。白盒测试最低应该达到的覆盖率目标是：语句覆盖率达到</font><font style="line-height: normal;" face="Times New Roman ">100</font><font style="line-height: normal;" face="宋体 ">％，分支覆盖率达到</font><font style="line-height: normal;" face="Times New Roman ">100</font><font style="line-height: normal;" face="宋体 ">％，覆盖程序中主要的路径，主要路径是指完成模块正常功能的路径和功能等其他异常处理执行的路径。</font></font><br style="line-height: normal;" />
<br style="line-height: normal;" />
<font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman ">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; </font><font style="line-height: normal;" face="宋体 ">测试人员在实际工作中要根据不同的覆盖要求来设计面向<span href="tag.php?name=%B4%FA%C2%EB" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">代码</span>的单元测试用例，<span href="tag.php?name=%D4%CB%D0%D0" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">运行</span>测试用例后至少应该实现如下几个覆盖需求：</font></font><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman "><br style="line-height: normal;" />
</font></font></span></span><blockquote>
<ul>
    <li><span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="宋体 ">对程序模块的所有独立的执行路径至少覆盖一次。</font></font></span></span></li>
    <li><span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="宋体 ">对所有的逻辑判定，真假两种情况都至少覆盖一次。</font></font></span></span></li>
    <li><span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="宋体 ">在循环的边界和运行界限内执行循环体，即用边界值的方法来测试循环体。</font></font></span></span></li>
    <li><span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="宋体 ">测试内部数据结构的有效性等。</font></font></span></span></li>
</ul>
</blockquote><span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><br style="line-height: normal;" />
<font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman ">&nbsp; &nbsp;&nbsp;&nbsp; </font><font style="line-height: normal;" face="宋体 ">黑盒测试是要首先了解软件产品具备的功能和<span href="tag.php?name=%D0%D4%C4%DC" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">性能</span>等需求，再根据需求设计一组测试用例以验证程序内部活动是否符合<strong style="text-align: left; font-style: normal; line-height: normal; font-weight: bold;"><a href="http://www.ltesting.net/html/62/category-catid-162.html" target="_blank" style="text-decoration: none; color: #244d8f; line-height: normal;">需求分析</a></strong>和设计要求的活动。在黑盒测试范畴内通常使用功能覆盖率来度量测试的完整性。而功能覆盖率中最常见的就是需求覆盖，目的就是通过设计一定的测试用例，使得每个需求点都被测试到。其次，还包括接口覆盖</font><font style="line-height: normal;" face="Times New Roman ">(</font><font style="line-height: normal;" face="宋体 ">又叫入口点覆盖</font><font style="line-height: normal;" face="Times New Roman ">)</font><font style="line-height: normal;" face="宋体 ">，其目的就是通过设计一定的测试用例使<span href="tag.php?name=%CF%B5%CD%B3" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">系统</span>的每个接口都被测试到。黑盒测试应达到的覆盖率目标是：程序单元正确地实现了需求分析和设计上要求的所有功能，满足性能要求，同时程序单元要有<strong style="text-align: left; font-style: normal; line-height: normal; font-weight: bold;"><a href="http://www.ltesting.net/html/95/category-catid-95.html" target="_blank" style="text-decoration: none; color: #244d8f; line-height: normal;">可靠性</a></strong>和安全性。</font></font><br style="line-height: normal;" />
<font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman ">&nbsp; &nbsp;&nbsp;&nbsp; </font><font style="line-height: normal;" face="宋体 ">测试人员在实际工作中至少应该设计能够覆盖如下需求的基于功能的单元测试用例：</font></font><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman "><br style="line-height: normal;" />
</font></font></span></span><blockquote><span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman ">(1)</font><font style="line-height: normal;" face="宋体 ">测试程序单元的功能是否实现。</font></font></span></span><br style="line-height: normal;" />
<span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman ">(2)</font><font style="line-height: normal;" face="宋体 ">测试程序单元性能是否满足要求（可选）。</font></font></span></span><br style="line-height: normal;" />
<span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman ">(3)</font><font style="line-height: normal;" face="宋体 ">是否有可选的其他测试特性，如边界、余量、安全性、可靠性、强度（<span href="tag.php?name=%D1%B9%C1%A6" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">压力</span>）测试、人机交互界面测试等。</font></font></span></span><br style="line-height: normal;" />
</blockquote><span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman ">&nbsp; &nbsp;&nbsp;</font><font style="line-height: normal;" face="宋体 ">无论是白盒测试还是黑盒测试，每个测试用例都应该包含下面</font><font style="line-height: normal;" face="Times New Roman ">4</font><font style="line-height: normal;" face="宋体 ">个关键元素：</font></font><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman "><br style="line-height: normal;" />
</font></font></span></span><blockquote><span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman ">(1)</font><font style="line-height: normal;" face="宋体 ">被测单元模块初始状态声明，即测试用例的开始状态（仅适用于被测单元维持了调用中间状态的情况）。</font></font></span></span><br style="line-height: normal;" />
<span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman ">(2)</font><font style="line-height: normal;" face="宋体 ">被测单元的输入，包含由被测单元读入的任何外部数据值。</font></font></span></span><br style="line-height: normal;" />
<span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman ">(3)</font><font style="line-height: normal;" face="宋体 ">该测试用例实际测试的代码，用被测单元的功能和测试<strong style="text-align: left; font-style: normal; line-height: normal; font-weight: bold;"><span style="text-decoration: none; color: #244d8f; line-height: normal;">用例设计</span></strong>中使用的分析来说明，如：单元中哪一个决策条件被测试。</font></font></span></span><br style="line-height: normal;" />
<span style="border-collapse: separate; color: #000000; font-family: simsun; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="border-collapse: collapse; color: #444444; font-family: Verdana; font-size: 14px; line-height: 22px; text-align: left;"><font style="line-height: normal;" color="#000000"><font style="line-height: normal;" face="Times New Roman ">(4)</font><font style="line-height: normal;" face="宋体 ">测试用例的期望输出<span href="tag.php?name=%BD%E1%B9%FB" onclick="tagshow(event)" class="t_tag" style="border-bottom: 1px solid #ff0000; line-height: normal; cursor: pointer; white-space: nowrap;">结果</span>（在测试进行之前的测试说明中定义</font><font style="line-height: normal;" face="Times New Roman ">)</font><font style="line-height: normal;" face="宋体 ">。</font></font></span></span></blockquote>
<img src ="http://www.blogjava.net/wenhl5656/aggbug/282918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-06-17 21:48 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/17/282918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>带通配符的字符匹配</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/16/282490.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Mon, 15 Jun 2009 17:02:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/16/282490.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     最常见的通配符是?和*。其中，?可以代表一个字符（不能没有），*可以代表任意多个字符（可以为空）。<br>    首先是?，根据?的功能，?表示任意字符，也就是说在匹配过程中，?永远匹配成功。本质上，?并没有修改算法，而仅仅修改了匹配规则——遇到?则一定匹配。<br>    然而*与此不同，*的作用是匹配任意多个字符，显然我们不能简单的修改匹配过程而满足要求。如果我们重新思考*的作用，我们会发现*的另一个作用就是分割P串，即如果P=P1*P2，那么与其说*代表匹配任意多个字符，不如说P的匹配条件是在匹配P1子串后再匹配P2子串。<br>    因此，可以写出带通配符的字符串匹配算法&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2009/06/16/282490.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/282490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-06-16 01:02 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/16/282490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解数据库范式——通俗易懂 [转]</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/15/282432.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Mon, 15 Jun 2009 12:01:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/15/282432.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  数据库范式是数据库设计中必不可少的知识，没有对范式的理解，就无法设计出高效率、优雅的数据库。甚至设计出错误的数据库。而想要理解并掌握范式却并不是那 么容易。教科书中一般以关系代数的方法来解释数据库范式。这样做虽然能够十分准确的表达数据库范式，但比较抽象，不太直观，不便于理解，更难以记忆。&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2009/06/15/282432.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/282432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-06-15 20:01 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/15/282432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计范式深入浅出(转)</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/15/282431.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Mon, 15 Jun 2009 12:00:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/15/282431.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: <br>关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式 现简单介绍1NF（第一范式），2NF（第二范式），3NF（第三范式）和BCNF，另有第四范式和第五范式留到以后再介绍。 在你设计数据库之时，若能符合这几个范式，你就是数据库设计的高手。j&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2009/06/15/282431.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/282431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-06-15 20:00 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/15/282431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络爬虫的一些功能要求整理（转）</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/04/280075.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Thu, 04 Jun 2009 13:07:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/04/280075.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘要：一，一个大容量的页面文件容器；二、一个高效的HTTP下载器；三、一个完善的URL提取器；四、一个便利的结构化数据提取器&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2009/06/04/280075.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/280075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-06-04 21:07 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/04/280075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）TB级别的网页容器实现方法参考</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/04/280073.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Thu, 04 Jun 2009 13:04:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/04/280073.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自javaeye。一个高性能的Web爬虫，必须有一个合适的网页容器。该容量最大的特点是要能够通过URL直接存取网页内容，并且要求有很高的性能，在一个千万级别的容器中存取一万次的时间应在1分钟左右(普通PC上)。采用拆衷的办法，在文件系统的基础上建立一组大文件和一组辅助文件，辅助文件实现通过URL定位该URL代表的网页在大文件中的位置，从页实现不随文件数量增长而性能变化的快速存取。以下将描述一个简洁的实现。  &nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2009/06/04/280073.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/280073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-06-04 21:04 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/04/280073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用中文分词- 整理收集</title><link>http://www.blogjava.net/wenhl5656/archive/2009/06/04/280071.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Thu, 04 Jun 2009 13:01:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/06/04/280071.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在网上搜集并整理了一些常用中文分词包，后面慢慢补全： 庖丁解牛分词包；LingPipe，开源自然语言处理的Java开源工具包；JE分词包；LibMMSeg；IKAnalyzer；PHPCWS&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2009/06/04/280071.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/280071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-06-04 21:01 <a href="http://www.blogjava.net/wenhl5656/archive/2009/06/04/280071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符集编码和编码字符集（转摘）</title><link>http://www.blogjava.net/wenhl5656/archive/2009/02/20/255893.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Fri, 20 Feb 2009 13:58:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2009/02/20/255893.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp; 字符集，指的是被分配了整数编号的<span style="color: #0817ff;">字符集合</span>；<br />
&nbsp;&nbsp;&nbsp; 但是，编码字符集中字符被分配的整数编号，不一定就是该字符在计算机中存储时所使用的值；<br />
&nbsp;&nbsp;&nbsp; 计算机中存储的字符到底使用什么二进制整数值来表示，是由<span style="color: #388fff;">字符集编码</span>决定的。<br />
<br />
&nbsp;&nbsp;&nbsp; 字符集编码决定了如何将一个字符的整数编号对应到一个二进制的整数值。<br />
&nbsp;&nbsp;&nbsp; 有的编码方案简单的将该整数值直接作为其在计算机中的表示而存储，例如英文字符。<br />
&nbsp;&nbsp;&nbsp; 几乎所有的字符集编码方案中，英文字母的整数编号与其在计算机内部存储的二进制形式都一致。<br />
&nbsp;&nbsp;&nbsp; 但有的编码方案，例如适用于Unicode字符集的UTF-8编码形式，就将很大一部分字符的整数编号作了变换后存储在计算机中。<br />
&nbsp;&nbsp;&nbsp; 以&#8220;汉&#8221;字为例，&#8220;汉&#8221;的Unicode值为0x6C49，但其编码为UTF-8格式后的值为0xE6B189（注意到变成了三个字节）。<br />
<br />
&nbsp;&nbsp;&nbsp; GB2312最初指的是一个编码字符集，其中包含了ASCII所包含的英文字符，同时加入了6763个简体汉字以及其他一些ASCII之外的符号。GB2312也有自己的编码方案，但这个方案直接使用一个字符在GB2312中的编号作为存储值（与UTF-32的做法类似）。<br />
&nbsp;&nbsp;&nbsp; 我们日常说起GB2312的时候，<strong>常常即指这个字符集，也指这种编码方案</strong>。<br />
<br />
&nbsp;&nbsp;&nbsp; GBK是GB2312的后续标准，添加了更多的汉字和特殊符号，类似的是，GBK也是同时指他的字符集和他的编码。<br />
&nbsp;&nbsp;&nbsp;
GBK还是现如今中文Windows操作系统的系统默认编码（这正是几乎所有网页上的，文件里的乱码问题的根源）。<br />
<br />
&nbsp;&nbsp;&nbsp; 在Java中，字符只以一种编码形式存在，那就是UTF-16。<br />
&nbsp;&nbsp;&nbsp;
但&#8220;在Java中&#8221;到底是指在哪里呢？就是指在JVM中，在内存中，代码里声明的每一个char，String类型的变量中。<br />
<br />
&nbsp;&nbsp;&nbsp; Python中既可以按Ascii编码，也可以按unicode编码。<br />
&nbsp; <br />
<img src ="http://www.blogjava.net/wenhl5656/aggbug/255893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2009-02-20 21:58 <a href="http://www.blogjava.net/wenhl5656/archive/2009/02/20/255893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Base64编码学习和java源程序实现</title><link>http://www.blogjava.net/wenhl5656/archive/2008/12/23/247948.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Tue, 23 Dec 2008 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/12/23/247948.html</guid><description><![CDATA[<a title="Google" href="http://g.cn">Google </a>Base64可以搜到相关原理和许多实现。<br />
下面是我的实现，和SUN公司提供的参考实现。<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Base64&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;base64_alphabet&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;&nbsp;5</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;编码原理:将3个字节转换成4个字节(&nbsp;(3&nbsp;X&nbsp;8)&nbsp;=&nbsp;24&nbsp;=&nbsp;(4&nbsp;X&nbsp;6)&nbsp;)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;&nbsp;6</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;先读入3个字节,每读一个字节,左移8位,再右移四次,每次6位,这样就有4个字节了<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;&nbsp;7</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;&nbsp;8</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);">&nbsp;data<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;&nbsp;9</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);">&nbsp;编码后的Base64字符串<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;10</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;Base64Encode(</span><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">[]&nbsp;data)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;builder&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;StringBuilder();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[]&nbsp;temp&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">];<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;len&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;data.length&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;data.length&nbsp;</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;len;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;goal&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;j&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;j&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">;&nbsp;j</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goal&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;&lt;=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">8</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goal&nbsp;</span><span style="color: rgb(0, 0, 0);">|=</span><span style="color: rgb(0, 0, 0);">&nbsp;(data[i&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;j]&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0xff</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;k&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;k&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;&nbsp;k</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[k]&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;goal&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0x3f</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goal&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;&gt;=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">6</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;k&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">;&nbsp;k&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;k</span><span style="color: rgb(0, 0, 0);">--</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;26</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.append(base64_alphabet.charAt(temp[k]));<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;28</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;29</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;index;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;30</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">switch</span><span style="color: rgb(0, 0, 0);">&nbsp;(data.length&nbsp;</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;31</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">:<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;32</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;data[data.length&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;33</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.append(base64_alphabet.charAt(index));<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;34</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(data[data.length&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0x03</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;35</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.append(base64_alphabet.charAt(index));<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;36</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.append(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;37</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">break</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;38</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">:<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;39</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;data[data.length&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;40</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.append(base64_alphabet.charAt(index));<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;41</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(data[data.length&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0x03</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;42</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">&nbsp;data[data.length&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;43</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.append(base64_alphabet.charAt(index));<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;44</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(data[data.length&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0x0f</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;45</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.append(base64_alphabet.charAt(index));<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;46</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.append(</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;47</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">break</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;48</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;49</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;builder.toString();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;50</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;51</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;52</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;53</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解码原理:将4个字节转换成3个字节.&nbsp;先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位.<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;54</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;55</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);">&nbsp;data<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;56</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需解码的Base64字符串。<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;57</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);">&nbsp;byte[]－解码出的字节数组<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;58</span>&nbsp;<span style="color: rgb(0, 128, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;59</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">[]&nbsp;Base64Decode(String&nbsp;data)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;60</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">[]&nbsp;chArray&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;data.toCharArray();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;61</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;len&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;chArray.length;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;62</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">[]&nbsp;result&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">[len&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">];<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;63</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,&nbsp;res_i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;len;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">,&nbsp;res_i&nbsp;</span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;64</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;goal&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;65</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;index&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;66</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;k&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;k&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;&nbsp;k</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;67</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;base64_alphabet.indexOf(chArray[i&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;k]);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;68</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goal&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;&lt;=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">6</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;69</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goal&nbsp;</span><span style="color: rgb(0, 0, 0);">|=</span><span style="color: rgb(0, 0, 0);">&nbsp;index;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;70</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;71</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;j&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;&nbsp;j&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;j</span><span style="color: rgb(0, 0, 0);">--</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;72</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[res_i&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;j]&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">)&nbsp;goal;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;73</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goal&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;&gt;=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">8</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;74</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;75</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;76</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;等号=的处理</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;77</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(chArray[len&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;78</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;result;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;79</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(chArray[len&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">]&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;80</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;Arrays.copyOf(result,&nbsp;result.length&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;81</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;82</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;Arrays.copyOf(result,&nbsp;result.length&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;83</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;84</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;85</span>&nbsp;<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;将&nbsp;s&nbsp;进行&nbsp;BASE64&nbsp;编码</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;86</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getBASE64(String&nbsp;s)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;87</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(s&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;88</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;89</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;sun.misc.BASE64Encoder()).encode(s.getBytes());<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;90</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;91</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;92</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;将&nbsp;BASE64&nbsp;编码的字符串&nbsp;s&nbsp;进行解码</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;93</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getFromBASE64(String&nbsp;s)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;94</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(s&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;95</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;96</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BASE64Decoder&nbsp;decoder&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;BASE64Decoder();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;97</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;98</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">byte</span><span style="color: rgb(0, 0, 0);">[]&nbsp;b&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;decoder.decodeBuffer(s);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;99</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;String(b);<br />
</span><span style="color: rgb(0, 128, 128);">100</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">101</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">102</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">103</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">104</span>&nbsp;<span style="color: rgb(0, 0, 0);">}</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/wenhl5656/aggbug/247948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-12-23 17:36 <a href="http://www.blogjava.net/wenhl5656/archive/2008/12/23/247948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 生成随机序列</title><link>http://www.blogjava.net/wenhl5656/archive/2008/12/23/247947.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Tue, 23 Dec 2008 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/12/23/247947.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 从网上总结的比较好的生成随机序列的算法：）&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2008/12/23/247947.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/247947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-12-23 17:32 <a href="http://www.blogjava.net/wenhl5656/archive/2008/12/23/247947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在VC中链接动态链接库的方法</title><link>http://www.blogjava.net/wenhl5656/archive/2008/10/04/232325.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Sat, 04 Oct 2008 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/10/04/232325.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在做VC项目时，用到的关于动态链接库的一些知识。<br>链接动态链接库的一些方法&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2008/10/04/232325.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/232325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-10-04 14:47 <a href="http://www.blogjava.net/wenhl5656/archive/2008/10/04/232325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>/subsystem:windows 与 /subsystem:console(转载)</title><link>http://www.blogjava.net/wenhl5656/archive/2008/10/02/232136.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Thu, 02 Oct 2008 15:15:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/10/02/232136.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;原文地址<span style="font-size: 12pt">：<a href="http://blog.csdn.net/lostangels/archive/2008/01/06/2027642.aspx">/subsystem:windows 与 /subsystem:console</a></span>&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 操作系统装载应用程序后，做完初始化工作就转到程序的入口点执行。程序的默认入口点实际上是由连接程序设置的，不同的连接器选择的入口函数也不尽相同。在VC++下，连接器对控制台程序设置的入口函数是 mainCRTStartup，mainCRTStartup 再调用你自己编写的 main 函数；对图形用户界面（GUI）程序设置的入口函数是 WinMainCRTStartup，WinMainCRTStartup 调用你自己写的 WinMain 函数。而具体设置哪个入口点是由连接器的&#8220;/subsystem:&#8221;选项参数确定的，它告诉操作系统如何运行编译生成的.EXE文件。可以指定四种方式：&#8220;CONSOLE|WINDOWS|NATIVE|POSIX&#8221;如果这个选项参数的值为&#8220;WINDOWS&#8221;，则表示该应用程序运行时不需要控制台，有关连接器参数选项的详细说明请参考 MSDN 库。&nbsp;
<p>以下四种组合，可以实现console和windows模式的混合，可以达到不弹出DOS窗口的效果，也可以达到在Windows程序中向控制台输出printf信息了。<br />
#pragma&nbsp;comment(&nbsp;linker,&nbsp;"/subsystem:windows /entry:WinMainCRTStartup"&nbsp;)<br />
#pragma&nbsp;comment(&nbsp;linker,&nbsp;"/subsystem:windows&nbsp;/entry:mainCRTStartup"&nbsp;)</p>
<p>#pragma&nbsp;comment(&nbsp;linker,&nbsp;"/subsystem:console&nbsp;/entry:mainCRTStartup"&nbsp;)<br />
#pragma&nbsp;comment(&nbsp;linker,&nbsp;"/subsystem:console /entry:WinMainCRTStartup"&nbsp;)</p>
<p><br />
int&nbsp;APIENTRY&nbsp;WinMain(HINSTANCE&nbsp;hInstance,<br />
HINSTANCE&nbsp;hPrevInstance,<br />
LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpCmdLine,<br />
int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nCmdShow)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; // ... ...<br />
}<br />
<br />
int&nbsp;main(void)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; // ... ...<br />
}<br />
<br />
<br />
</p>
<img src ="http://www.blogjava.net/wenhl5656/aggbug/232136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-10-02 23:15 <a href="http://www.blogjava.net/wenhl5656/archive/2008/10/02/232136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言运算优先级</title><link>http://www.blogjava.net/wenhl5656/archive/2008/09/23/230693.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Tue, 23 Sep 2008 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/09/23/230693.html</guid><description><![CDATA[<img height="441" alt="" src="http://www.blogjava.net/images/blogjava_net/wenhl5656/1.JPG" width="339" border="0" />
 <img src ="http://www.blogjava.net/wenhl5656/aggbug/230693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-09-23 16:04 <a href="http://www.blogjava.net/wenhl5656/archive/2008/09/23/230693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言宏定义技巧</title><link>http://www.blogjava.net/wenhl5656/archive/2008/09/23/230554.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Tue, 23 Sep 2008 01:11:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/09/23/230554.html</guid><description><![CDATA[C语言宏定义技巧（常用宏定义）&nbsp; <br />
&nbsp; <br />
写好C语言，漂亮的宏定义很重要，使用宏定义可以防止出错，提高可移植性，可读性，方便性&nbsp;等等。下面列举一些成熟软件中常用得宏定义。。。。。。 <br />
<br />
&nbsp; <br />
<br />
1，防止一个头文件被重复包含 <br />
<br />
#ifndef&nbsp;COMDEF_H <br />
<br />
#define&nbsp;COMDEF_H <br />
<br />
&nbsp;&nbsp;//头文件内容 <br />
<br />
#endif <br />
<br />
2，重新定义一些类型，防止由于各种平台和编译器的不同，而产生的类型字节数差异，方便移植。 <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Boolean&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;long&nbsp;int&nbsp;&nbsp;uint32;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;32&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint16;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;16&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;long&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;int32;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;32&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int16;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;16&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
&nbsp; <br />
<br />
//下面的不建议使用 <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;word;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsinged&nbsp;16&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;32&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;uint2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;16&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unsigned&nbsp;32&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;16&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;long&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;32&nbsp;bit&nbsp;value&nbsp;type.&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sint31;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;32&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sint15;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;16&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
typedef&nbsp;&nbsp;signed&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sint7;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Signed&nbsp;8&nbsp;&nbsp;bit&nbsp;value&nbsp;*/ <br />
<br />
&nbsp; <br />
<br />
3，得到指定地址上的一个字节或字 <br />
<br />
#define&nbsp;&nbsp;MEM_B(&nbsp;x&nbsp;)&nbsp;&nbsp;(&nbsp;*(&nbsp;(byte&nbsp;*)&nbsp;(x)&nbsp;)&nbsp;) <br />
<br />
#define&nbsp;&nbsp;MEM_W(&nbsp;x&nbsp;)&nbsp;&nbsp;(&nbsp;*(&nbsp;(word&nbsp;*)&nbsp;(x)&nbsp;)&nbsp;) <br />
<br />
4，求最大值和最小值 <br />
<br />
&nbsp;&nbsp;&nbsp;#define&nbsp;&nbsp;MAX(&nbsp;x,&nbsp;y&nbsp;)&nbsp;(&nbsp;((x)&nbsp;&gt;&nbsp;(y))&nbsp;?&nbsp;(x)&nbsp;:&nbsp;(y)&nbsp;) <br />
<br />
&nbsp;&nbsp;&nbsp;#define&nbsp;&nbsp;MIN(&nbsp;x,&nbsp;y&nbsp;)&nbsp;(&nbsp;((x)&nbsp;&lt;&nbsp;(y))&nbsp;?&nbsp;(x)&nbsp;:&nbsp;(y)&nbsp;) <br />
<br />
5，得到一个field在结构体(struct)中的偏移量 <br />
<br />
#define&nbsp;FPOS(&nbsp;type,&nbsp;field&nbsp;)&nbsp;\ <br />
<br />
/*lint&nbsp;-e545&nbsp;*/&nbsp;(&nbsp;(dword)&nbsp;&amp;((&nbsp;type&nbsp;*)&nbsp;0)-&gt;&nbsp;field&nbsp;)&nbsp;/*lint&nbsp;+e545&nbsp;*/ <br />
<br />
6,得到一个结构体中field所占用的字节数 <br />
<br />
#define&nbsp;FSIZ(&nbsp;type,&nbsp;field&nbsp;)&nbsp;sizeof(&nbsp;((type&nbsp;*)&nbsp;0)-&gt;field&nbsp;) <br />
<br />
7，按照LSB格式把两个字节转化为一个Word <br />
<br />
#define&nbsp;&nbsp;FLIPW(&nbsp;ray&nbsp;)&nbsp;(&nbsp;(((word)&nbsp;(ray)[0])&nbsp;*&nbsp;256)&nbsp;+&nbsp;(ray)[1]&nbsp;) <br />
<br />
8，按照LSB格式把一个Word转化为两个字节 <br />
<br />
#define&nbsp;&nbsp;FLOPW(&nbsp;ray,&nbsp;val&nbsp;)&nbsp;\ <br />
<br />
&nbsp;&nbsp;(ray)[0]&nbsp;=&nbsp;((val)&nbsp;/&nbsp;256);&nbsp;\ <br />
<br />
&nbsp;&nbsp;(ray)[1]&nbsp;=&nbsp;((val)&nbsp;&amp;&nbsp;0xFF) <br />
<br />
9，得到一个变量的地址（word宽度） <br />
<br />
#define&nbsp;&nbsp;B_PTR(&nbsp;var&nbsp;)&nbsp;&nbsp;(&nbsp;(byte&nbsp;*)&nbsp;(void&nbsp;*)&nbsp;&amp;(var)&nbsp;) <br />
<br />
#define&nbsp;&nbsp;W_PTR(&nbsp;var&nbsp;)&nbsp;&nbsp;(&nbsp;(word&nbsp;*)&nbsp;(void&nbsp;*)&nbsp;&amp;(var)&nbsp;) <br />
<br />
10，得到一个字的高位和低位字节 <br />
<br />
#define&nbsp;&nbsp;WORD_LO(xxx)&nbsp;&nbsp;((byte)&nbsp;((word)(xxx)&nbsp;&amp;&nbsp;255)) <br />
<br />
#define&nbsp;&nbsp;WORD_HI(xxx)&nbsp;&nbsp;((byte)&nbsp;((word)(xxx)&nbsp;&gt;&gt;&nbsp;8)) <br />
<br />
11，返回一个比X大的最接近的8的倍数 <br />
<br />
#define&nbsp;RND8(&nbsp;x&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((((x)&nbsp;+&nbsp;7)&nbsp;/&nbsp;8&nbsp;)&nbsp;*&nbsp;8&nbsp;) <br />
<br />
12，将一个字母转换为大写 <br />
<br />
#define&nbsp;&nbsp;UPCASE(&nbsp;c&nbsp;)&nbsp;(&nbsp;((c)&nbsp;&gt;=&nbsp;'a'&nbsp;&amp;&amp;&nbsp;(c)&nbsp;&lt;=&nbsp;'z')&nbsp;?&nbsp;((c)&nbsp;-&nbsp;0x20)&nbsp;:&nbsp;(c)&nbsp;) <br />
<br />
13，判断字符是不是10进值的数字 <br />
<br />
#define&nbsp;&nbsp;DECCHK(&nbsp;c&nbsp;)&nbsp;((c)&nbsp;&gt;=&nbsp;'0'&nbsp;&amp;&amp;&nbsp;(c)&nbsp;&lt;=&nbsp;'9') <br />
<br />
14，判断字符是不是16进值的数字 <br />
<br />
#define&nbsp;&nbsp;HEXCHK(&nbsp;c&nbsp;)&nbsp;(&nbsp;((c)&nbsp;&gt;=&nbsp;'0'&nbsp;&amp;&amp;&nbsp;(c)&nbsp;&lt;=&nbsp;'9')&nbsp;||\ <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((c)&nbsp;&gt;=&nbsp;'A'&nbsp;&amp;&amp;&nbsp;(c)&nbsp;&lt;=&nbsp;'F')&nbsp;||\ <br />
<br />
((c)&nbsp;&gt;=&nbsp;'a'&nbsp;&amp;&amp;&nbsp;(c)&nbsp;&lt;=&nbsp;'f')&nbsp;) <br />
<br />
15，防止溢出的一个方法 <br />
<br />
#define&nbsp;&nbsp;INC_SAT(&nbsp;val&nbsp;)&nbsp;&nbsp;(val&nbsp;=&nbsp;((val)+1&nbsp;&gt;&nbsp;(val))&nbsp;?&nbsp;(val)+1&nbsp;:&nbsp;(val)) <br />
<br />
16，返回数组元素的个数 <br />
<br />
#define&nbsp;&nbsp;ARR_SIZE(&nbsp;a&nbsp;)&nbsp;&nbsp;(&nbsp;sizeof(&nbsp;(a)&nbsp;)&nbsp;/&nbsp;sizeof(&nbsp;(a[0])&nbsp;)&nbsp;) <br />
<br />
17，返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n) <br />
<br />
#define&nbsp;MOD_BY_POWER_OF_TWO(&nbsp;val,&nbsp;mod_by&nbsp;)&nbsp;\ <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;(dword)(val)&nbsp;&amp;&nbsp;(dword)((mod_by)-1)&nbsp;) <br />
<br />
18，对于IO空间映射在存储空间的结构，输入输出处理 <br />
<br />
&nbsp;&nbsp;#define&nbsp;inp(port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;byte&nbsp;*)&nbsp;(port))) <br />
<br />
&nbsp;&nbsp;#define&nbsp;inpw(port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;word&nbsp;*)&nbsp;(port))) <br />
<br />
&nbsp;&nbsp;#define&nbsp;inpdw(port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;dword&nbsp;*)(port))) <br />
<br />
&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;#define&nbsp;outp(port,&nbsp;val)&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;byte&nbsp;*)&nbsp;(port))&nbsp;=&nbsp;((byte)&nbsp;(val))) <br />
<br />
&nbsp;&nbsp;#define&nbsp;outpw(port,&nbsp;val)&nbsp;&nbsp;(*((volatile&nbsp;word&nbsp;*)&nbsp;(port))&nbsp;=&nbsp;((word)&nbsp;(val))) <br />
<br />
&nbsp;&nbsp;#define&nbsp;outpdw(port,&nbsp;val)&nbsp;(*((volatile&nbsp;dword&nbsp;*)&nbsp;(port))&nbsp;=&nbsp;((dword)&nbsp;(val))) <br />
<br />
[2005-9-9添加]&nbsp; <br />
<br />
19,使用一些宏跟踪调试 <br />
<br />
A&nbsp;N&nbsp;S&nbsp;I标准说明了五个预定义的宏名。它们是： <br />
<br />
_&nbsp;L&nbsp;I&nbsp;N&nbsp;E&nbsp;_ <br />
<br />
_&nbsp;F&nbsp;I&nbsp;L&nbsp;E&nbsp;_ <br />
<br />
_&nbsp;D&nbsp;A&nbsp;T&nbsp;E&nbsp;_ <br />
<br />
_&nbsp;T&nbsp;I&nbsp;M&nbsp;E&nbsp;_ <br />
<br />
_&nbsp;S&nbsp;T&nbsp;D&nbsp;C&nbsp;_ <br />
<br />
如果编译不是标准的，则可能仅支持以上宏名中的几个，或根本不支持。记住编译程序 <br />
<br />
也许还提供其它预定义的宏名。 <br />
<br />
_&nbsp;L&nbsp;I&nbsp;N&nbsp;E&nbsp;_及_&nbsp;F&nbsp;I&nbsp;L&nbsp;E&nbsp;_宏指令在有关#&nbsp;l&nbsp;i&nbsp;n&nbsp;e的部分中已讨论，这里讨论其余的宏名。 <br />
<br />
_&nbsp;D&nbsp;AT&nbsp;E&nbsp;_宏指令含有形式为月/日/年的串，表示源文件被翻译到代码时的日期。 <br />
<br />
源代码翻译到目标代码的时间作为串包含在_&nbsp;T&nbsp;I&nbsp;M&nbsp;E&nbsp;_中。串形式为时：分：秒。 <br />
<br />
如果实现是标准的，则宏_&nbsp;S&nbsp;T&nbsp;D&nbsp;C&nbsp;_含有十进制常量1。如果它含有任何其它数，则实现是 <br />
<br />
非标准的。 <br />
<br />
可以定义宏，例如: <br />
<br />
当定义了_DEBUG，输出数据信息和所在文件所在行 <br />
<br />
#ifdef&nbsp;_DEBUG <br />
<br />
#define&nbsp;DEBUGMSG(msg,date)&nbsp;printf(msg);printf(&#8220;%d%d%d&#8221;,date,_LINE_,_FILE_) <br />
<br />
#else <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;DEBUGMSG(msg,date)&nbsp; <br />
<br />
#endif <br />
<br />
&nbsp; <br />
<br />
20，宏定义防止使用是错误 <br />
<br />
用小括号包含。 <br />
<br />
例如：#define&nbsp;ADD(a,b)&nbsp;（a+b） <br />
<br />
用do{}while(0)语句包含多语句防止错误 <br />
<br />
例如：#difne&nbsp;DO(a,b)&nbsp;a+b;\ <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a++; <br />
<br />
应用时：if(&#8230;.) <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DO(a,b);&nbsp;//产生错误 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
解决方法:&nbsp;#difne&nbsp;DO(a,b)&nbsp;do{a+b;\ <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a++;}while(0)&nbsp;<br />
<br />
&nbsp; <br />
宏中"#"和"##"的用法 <br />
一、一般用法 <br />
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. <br />
用法: <br />
＃i nclude&lt;cstdio&gt; <br />
＃i nclude&lt;climits&gt; <br />
using&nbsp;namespace&nbsp;std; <br />
<br />
#define&nbsp;STR(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#s <br />
#define&nbsp;CONS(a,b)&nbsp;&nbsp;int(a##e##b) <br />
<br />
int&nbsp;main() <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(STR(vck));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;输出字符串"vck" <br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;CONS(2,3));&nbsp;&nbsp;//&nbsp;2e3&nbsp;输出:2000 <br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; <br />
} <br />
<br />
二、当宏参数是另一个宏的时候 <br />
需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. <br />
<br />
1,&nbsp;非'#'和'##'的情况 <br />
#define&nbsp;TOW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2) <br />
#define&nbsp;MUL(a,b)&nbsp;(a*b) <br />
<br />
printf("%d*%d=%d\n",&nbsp;TOW,&nbsp;TOW,&nbsp;MUL(TOW,TOW)); <br />
这行的宏会被展开为： <br />
printf("%d*%d=%d\n",&nbsp;(2),&nbsp;(2),&nbsp;((2)*(2))); <br />
MUL里的参数TOW会被展开为(2). <br />
<br />
2,&nbsp;当有'#'或'##'的时候 <br />
#define&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2) <br />
#define&nbsp;STR(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#s <br />
#define&nbsp;CONS(a,b)&nbsp;&nbsp;int(a##e##b) <br />
<br />
printf("int&nbsp;max:&nbsp;%s\n",&nbsp;&nbsp;STR(INT_MAX));&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;INT_MAX&nbsp;＃i nclude&lt;climits&gt; <br />
这行会被展开为： <br />
printf("int&nbsp;max:&nbsp;%s\n",&nbsp;"INT_MAX"); <br />
<br />
printf("%s\n",&nbsp;CONS(A,&nbsp;A));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;compile&nbsp;error&nbsp; <br />
这一行则是： <br />
printf("%s\n",&nbsp;int(AeA)); <br />
<br />
INT_MAX和A都不会再被展开,&nbsp;然而解决这个问题的方法很简单.&nbsp;加多一层中间转换宏. <br />
加这层宏的用意是把所有宏的参数在这层里全部展开,&nbsp;那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数. <br />
<br />
#define&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2) <br />
#define&nbsp;_STR(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#s <br />
#define&nbsp;STR(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_STR(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;转换宏 <br />
#define&nbsp;_CONS(a,b)&nbsp;&nbsp;int(a##e##b) <br />
#define&nbsp;CONS(a,b)&nbsp;&nbsp;&nbsp;_CONS(a,b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;转换宏 <br />
<br />
printf("int&nbsp;max:&nbsp;%s\n",&nbsp;STR(INT_MAX));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;INT_MAX,int型的最大值，为一个变量&nbsp;＃i nclude&lt;climits&gt; <br />
输出为:&nbsp;int&nbsp;max:&nbsp;0x7fffffff <br />
STR(INT_MAX)&nbsp;--&gt;&nbsp;&nbsp;_STR(0x7fffffff)&nbsp;然后再转换成字符串； <br />
<br />
printf("%d\n",&nbsp;CONS(A,&nbsp;A)); <br />
输出为：200 <br />
CONS(A,&nbsp;A)&nbsp;&nbsp;--&gt;&nbsp;&nbsp;_CONS((2),&nbsp;(2))&nbsp;&nbsp;--&gt;&nbsp;int((2)e(2)) <br />
<br />
三、'#'和'##'的一些应用特例 <br />
1、合并匿名变量名 <br />
#define&nbsp;&nbsp;___ANONYMOUS1(type,&nbsp;var,&nbsp;line)&nbsp;&nbsp;type&nbsp;&nbsp;var##line <br />
#define&nbsp;&nbsp;__ANONYMOUS0(type,&nbsp;line)&nbsp;&nbsp;___ANONYMOUS1(type,&nbsp;_anonymous,&nbsp;line) <br />
#define&nbsp;&nbsp;ANONYMOUS(type)&nbsp;&nbsp;__ANONYMOUS0(type,&nbsp;__LINE__) <br />
例：ANONYMOUS(static&nbsp;int);&nbsp;&nbsp;即:&nbsp;static&nbsp;int&nbsp;_anonymous70;&nbsp;&nbsp;70表示该行行号； <br />
第一层：ANONYMOUS(static&nbsp;int);&nbsp;&nbsp;--&gt;&nbsp;&nbsp;__ANONYMOUS0(static&nbsp;int,&nbsp;__LINE__); <br />
第二层：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;&nbsp;___ANONYMOUS1(static&nbsp;int,&nbsp;_anonymous,&nbsp;70); <br />
第三层：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;&nbsp;static&nbsp;int&nbsp;&nbsp;_anonymous70; <br />
即每次只能解开当前层的宏，所以__LINE__在第二层才能被解开； <br />
<br />
2、填充结构 <br />
#define&nbsp;&nbsp;FILL(a)&nbsp;&nbsp;&nbsp;{a,&nbsp;#a} <br />
<br />
enum&nbsp;IDD{OPEN,&nbsp;CLOSE}; <br />
typedef&nbsp;struct&nbsp;MSG{ <br />
&nbsp;&nbsp;IDD&nbsp;id; <br />
&nbsp;&nbsp;const&nbsp;char&nbsp;*&nbsp;msg; <br />
}MSG; <br />
<br />
MSG&nbsp;_msg[]&nbsp;=&nbsp;{FILL(OPEN),&nbsp;FILL(CLOSE)}; <br />
相当于： <br />
MSG&nbsp;_msg[]&nbsp;=&nbsp;{{OPEN,&nbsp;"OPEN"}, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{CLOSE,&nbsp;"CLOSE"}}; <br />
<br />
3、记录文件名 <br />
#define&nbsp;&nbsp;_GET_FILE_NAME(f)&nbsp;&nbsp;&nbsp;#f <br />
#define&nbsp;&nbsp;GET_FILE_NAME(f)&nbsp;&nbsp;&nbsp;&nbsp;_GET_FILE_NAME(f) <br />
static&nbsp;char&nbsp;&nbsp;FILE_NAME[]&nbsp;=&nbsp;GET_FILE_NAME(__FILE__); <br />
<br />
4、得到一个数值类型所对应的字符串缓冲大小 <br />
#define&nbsp;&nbsp;_TYPE_BUF_SIZE(type)&nbsp;&nbsp;sizeof&nbsp;#type <br />
#define&nbsp;&nbsp;TYPE_BUF_SIZE(type)&nbsp;&nbsp;&nbsp;_TYPE_BUF_SIZE(type) <br />
char&nbsp;&nbsp;buf[TYPE_BUF_SIZE(INT_MAX)]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;&nbsp;char&nbsp;&nbsp;buf[_TYPE_BUF_SIZE(0x7fffffff)]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;&nbsp;char&nbsp;&nbsp;buf[sizeof&nbsp;"0x7fffffff"]; <br />
这里相当于： <br />
 <img src ="http://www.blogjava.net/wenhl5656/aggbug/230554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-09-23 09:11 <a href="http://www.blogjava.net/wenhl5656/archive/2008/09/23/230554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google牛人集</title><link>http://www.blogjava.net/wenhl5656/archive/2008/06/04/205791.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Wed, 04 Jun 2008 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/06/04/205791.html</guid><description><![CDATA[1 Vinton Cerf ：号称互联网之父，TCIP/IP协议和互联网架构的合作设计者。他05年10月3日开始正式为google工作，职位为&#8220;首席互联网传布官&#8221;。<br />
<br />
2 Joshua Bloch ：号称java教父，《Effective Java》的作者，JSR175标准的leader，J2SE 1.5的主要开发人员之一。<br />
<br />
3 Guido Van Rossum： Python之父。Google把python用的炉火纯青，有了python之父的加盟，肯定如虎添翼了。<br />
<br />
4 Andrew Morton： linux的二号人物。其在google的工作仍是继续维护linux2.6内核<br />
<br />
5 Mark Lucovsky： Windows核心设计师。不晓得碰到了Morton会不会吵起来（-：<br />
<br />
6 Bram Moolenaar：Vim的作者<br />
<br />
7 Darin Fisher ：Mozilla项目主力开发者<br />
<br />
8 Sean Egan： Gaim开发团队的leader<br />
<br />
9 Greg Stein： Apache项目主要开发者，Apache基金会主席<br />
<br />
10 Udi Manber： Amazon的A9搜索团队总监<br />
<br />
11 Rob Pike，Plan 9 OS主力开发者<br />
<br />
12 Adam Bosworth： BEA的首席架构师<br />
<br />
13 Larry Brilliant： 网络先驱大慈善家，负责google.org<br />
<br />
14 Andy Hertzfeld：曾经是Macintosh研发团队核心成员<br />
<br />
15 Louis Monier：Internet搜索的发明者，eBay的前开发总监<br />
<br />
16 Adndrew W Moore ：卡内基美隆大学资讯与机器人工程学的教授，他将负责Google在匹兹堡新创立的实验室<br />
<br />
17 Alan Davidson：Centre for Democracy &amp; Technology的协理，他负责处理处理google与美国政府的关系<br />
<br />
18 Ben Goodger：Firefox的主要设计者<br />
<br />
Google高层管理团队<br />
<br />
Eric Schmidt 博士，董事长兼首席执行官 <br />
在就职于 Novell 公司之前，Eric 曾任 Sun Microsystems, Inc.的首席技术官和公司行政主管。在此期间，他负责开发了 Sun 独立于平台的编程技术 Java，并确立了 Sun 的互联网软件战略。在 1983 年加入 Sun 之前，Eric 是施乐帕洛阿图研究中心 (Xerox Palo Alto Research Center, PARC) 计算机科学实验室的研究员，并曾在贝尔实验室和 Zilog 任职。Eric 在普林斯顿大学获电气工程专业的理学学士学位，并在加州大学伯克莱分校获计算机专业硕士和博士学位。2006 年，Eric 因推动全球最成功的互联网搜索引擎公司的战略发展而获得认可，入选国家工程学院。 <br />
<br />
Larry Page，创始人兼产品总裁 <br />
Sergey Brin，创始人兼技术总裁 <br />
Shona Brown，业务运营高级副总裁 <br />
W. M. Coughran, Jr.，工程事务副总裁 <br />
在 20 余年的计算机职业生涯中，Bill 曾从事过网络系统内置软件、安全系统产品以及计算机科学和工程等方面的工作。在加入 Google 之前， Bill 在硅谷创建了 Entrisphere 公司，并担任首席执行官和其他一些行政职务。此前，他是贝尔实验室成员，是计算科学研究中心 (Computing Sciences Research Center) 的领导人，开发了 C、C++、Unix、Plan 9 以及 Inferno。他在计算机科学和分布式系统方面，做出了卓越贡献。<br />
<br />
David C. Drummond，公司发展事务高级副总裁 <br />
Alan Eustace，工程与研究高级副总裁 <br />
Alan Eustace 任 Google 公司工程部副总裁，全面负责公司产品研究和发展事务。Alan 于 2002 年夏加入 Google 公司。此前，他在 Digital/Compaq/HP 的西方研究实验室 (Western Research Laboratory, WRL) 工作了15年，进行了多种芯片设计和结构项目的研究， 包括 MicroTitan Floating Point 单元、BIPS &#8211;－ 当时速度最快的微处理器。Alan 还与 Amitabh Srivastava 一起从事 ATOM 方面的工作，即二进制编码仪器系统，为多种程序分析以及计算机结构分析工具奠定了基础。这些工具对于 EV5、 EV6和 EV7 芯片设计来说，具有极其深远的影响。1999 年，Alan 升任西方研究实验室 (Western Research Laboratory, WRL) 董事。WRL 积极进行袖珍式计算机，芯片多元化处理器，功率和能量管理，互联网性能以及频率和电压缩放比例等项目的研究。<br />
<br />
Urs H&#246;lzle，运营高级副总裁兼 Google Fellow <br />
作为动态编译（也称为&#8220;即时编译&#8221;）的先导之一，Urs 发明了今天大多数先进 Java 编译器仍在使用的基础技术。在加入 Google 前，Urs 是 Animorphic Systems 的创始人之一，该公司开发了 Smalltalk 和 Java 的编译器。Sun Microsystems 于 1997 年收购 Animorphic Systems 后，他协助开发了 Javasoft 的高性能 Hotspot Java 编译器。<br />
<br />
Jeff Huber，工程事务副总裁 <br />
加入 Google 之前，Jeff 是 eBay 公司的结构与系统开发事务副总裁。在此期间，他成功完成了产品搜索基础结构的开发和平台 API 程序的扩展。就职于 eBay 公司之前，Jeff 是 Excite@Home 公司的高级工程副总裁，主管为最大的宽带服务提供商开发消费者产品以及基础设施建设。<br />
<br />
Omid Kordestani，全球销售及业务拓展高级副总裁 <br />
George Reyes，高级副总裁兼首席财务官 <br />
Jonathan Rosenberg，产品管理事务高级副总裁 <br />
Elliot Schrage，全球通联及公共事务副总裁 <br />
<br />
Google 管理团队<br />
<br />
Tim Armstrong, 广告销售事务副总裁 <br />
Nikesh Arora，欧洲运营副总裁。 <br />
Sukhinder Singh Cassidy，亚太和拉丁美洲地区运营副总裁 <br />
Vinton G. Cerf，副总裁兼首席互联网顾问 <br />
Vinton G. Cerf 是 Google 的副总裁兼首席互联网顾问他负责为公司在互联网及其他平台上确定新的可行技术和应用程序。<br />
<br />
作为闻名遐迩的&#8220;互联网之父&#8221;，Vint 和 Robert Kahn 合作设计了 TCP/IP 协议及互联网的基础体系结构。为了表示对其工作的认可，克林顿总统于 1997 年向他们授予美国国家科技奖章。2005 年，Vint 和 Bob 荣获美国非军人最高荣誉勋章 — 总统自由勋章。这证明，他们在用于互联网内数据传输的软件代码方面的工作已将他们推上&#8220;改变了全球商务、通信和娱乐状况的数字革命的最前沿&#8221;。<br />
<br />
从 1994 年到 2005 年，Vint 一直在 MCI 担任高级副总裁；此前，他担任美国国家研究推进机构 (CNRI, Corporation for National Research Initiatives) 的副总裁；在 1982 年至 1986 年间，他担任 MCI 副总裁；从 1976 年到 1982 年，在任职美国国防部高级研究项目机构 (DARPA, U.S. Department of Defense's Advanced Research Projects Agency) 期间，Vint 领导了互联网及与互联网相关的数据包技术和安全技术的开发工作，在其中发挥了关键作用。<br />
<br />
从 2000 年开始，Vint 担任了互联网名称与数字地址分配机构 (ICANN, Internet Corporation for Assigned Names and Numbers) 董事长，并于 1998 年成为喷气推进技术实验室 (Jet Propulsion Laboratory) 的访问学者。1992 年至 1995 年，作为机构的创始人，他担任互联网协会 (ISOC, Internet Society) 总裁，并在 2000 年之前一直任 ISOC 理事会成员。Vint 同时也是 IEEE、ACM、AAAS、美国文理科学院 (American Academy of Arts and Sciences)、国际工程联合会 (International Engineering Consortium)、美国计算机历史博物馆 (Computer History Museum) 和美国国家工程院 (National Academy of Engineering) 成员。<br />
<br />
<br />
Vint 获得过无数同互联网工作相关的奖项和荣誉，包括马可尼奖 (Marconi Fellowship)、美国国家工程院颁发的 Charles Stark Draper 奖、科学技术 Prince of Asturias 奖、Alexander Graham Bell Association for the Deaf 颁发的 Alexander Graham Bell 奖、美国计算机机械协会 (Association for Computer Machinery) 颁发的图灵奖 (A.M. Turing Award)、国际电信联盟 (International Telecommunications Union) 银奖和 IEEE Alexander Graham Bell 奖章等等。<br />
<br />
Vint 拥有美国加州大学洛杉矶分校 (UCLA) 计算机科学博士学位及十余个名誉学位。<br />
<br />
Salar Kamangar，产品管理副总裁 <br />
Marissa Mayer，搜索产品与用户体验副总裁 <br />
Norio Murakami，Google 日本副总裁兼总经理 <br />
Miriam Rivera，副总裁兼代理总法律顾问 <br />
Sheryl Sandberg，全球在线销售和运营副总裁 <br />
Susan Wojcicki，产品管理副总裁 <br />
董事会<br />
<br />
Eric Schmidt 博士，Google Inc. <br />
Sergey Brin，Google Inc. <br />
Larry Page，Google Inc. <br />
John Doerr，Kleiner Perkins Caufield &amp; Byers 公司 <br />
Michael Moritz，Sequoia Capital 公司 <br />
Ram Shriram，Sherpalo 公司 <br />
John Hennessy，斯坦福大学 <br />
Arthur Levinson，Genentech <br />
Paul Otellini，Intel <br />
Shirley M. Tilghman，普林斯顿大学 <br />
Ann Mather <br />
<br />
王怀南&nbsp;&nbsp;Google中文名谷歌创造人&nbsp;&nbsp;亚太市场总监&nbsp;&nbsp;已离职<br />
<img src ="http://www.blogjava.net/wenhl5656/aggbug/205791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-06-04 14:05 <a href="http://www.blogjava.net/wenhl5656/archive/2008/06/04/205791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle埃里森的演讲——历史上最牛的演讲（ZZ）</title><link>http://www.blogjava.net/wenhl5656/archive/2008/06/04/205781.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Wed, 04 Jun 2008 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/06/04/205781.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这是甲骨文公司总裁Larry Ellison (Oracle CEO) 在耶鲁大学Yale University 给2000级毕业生the graduating class of 2000所作的演讲全文，由于他句句惊人，很冷，最后被耶鲁大学保安请下讲台。该演讲号称历史最牛之演讲，但是否classic则不得而知，美国出版的一本大学经典演讲集未将其收入其中。 <br><br>历史上最牛的演讲———甲骨文总裁拉里埃里森在耶鲁大学的演讲<br><br>耶鲁的毕业生们，我很抱歉---如果你们不喜欢这样的开场白。我想请你们为我做一件 事。请你---好好看一看周围，看一看站在你左边的同学，看一看站在你右边的同学。 请你设想这样的情况：从现在起5年之后，10年之后，或30年之后，今天站在你左边的 这个人会是一个失败者；右边的这个人，同样，也是个失败者。而你，站在中间的家伙， 你以为会怎样？ 一样是失败者。失败的经历。失败的优等生。&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2008/06/04/205781.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/205781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-06-04 13:54 <a href="http://www.blogjava.net/wenhl5656/archive/2008/06/04/205781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>传奇编程高手(zz转)</title><link>http://www.blogjava.net/wenhl5656/archive/2008/06/04/205780.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Wed, 04 Jun 2008 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/06/04/205780.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Bill Joy MIT BBS上说微软电话面试的一道题就是“Who do you think is the best coder, and why?”。我觉得挺有意思的，也来凑个热闹。排名不分先后。 <br><br>传奇编程高手：<br>Bill Joy<br>John Carmack <br>David Cutler <br>Donald E. Knuth <br>Ken Thompson <br>Rob Pike <br>Dennis M. Ritchie <br>Edsger Wybe Dijkstra <br>Anders Hejlsberg <br>&nbsp;&nbsp;<a href='http://www.blogjava.net/wenhl5656/archive/2008/06/04/205780.html'>阅读全文</a><img src ="http://www.blogjava.net/wenhl5656/aggbug/205780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-06-04 13:52 <a href="http://www.blogjava.net/wenhl5656/archive/2008/06/04/205780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows XP的启动过程</title><link>http://www.blogjava.net/wenhl5656/archive/2008/06/01/205198.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Sun, 01 Jun 2008 12:20:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/06/01/205198.html</guid><description><![CDATA[<p>从按下计算机开关启动计算机，到登入到桌面完成启动，一共经过了以下几个阶段：</p>
<p>　　1. 预引导（Pre-Boot）阶段；<br />
　　2. 引导阶段；</p>
<p>　　3. 加载内核阶段；<br />
　　4. 初始化内核阶段；<br />
　　5. 登陆。</p>
<p>　　每个启动阶段的详细介绍</p>
<p>　　a） 预引导阶段</p>
<p>　　在按下计算机电源使计算机启动，并且在Windows XP专业版操作系统启动之前这段时<br />
间，我们称之为预引导（Pre-Boot）阶段，在这个阶段里，计算机首先运行Power On Sel<br />
f Test（POST），POST检测系统的总内存以及其他硬件设备的现状。如果计算机系统的BI<br />
OS（基础输入/输出系统）是即插即用的，那么计算机硬件设备将经过检验以及完成配置。<br />
计算机的基础输入/输出系统（BIOS）定位计算机的引导设备，然后MBR（Master Boot Re<br />
cord）被加载并运行。在预引导阶段，计算机要加载Windows XP的NTLDR文件。</p>
<p>　　b） 引导阶段</p>
<p>　　Windows XP Professional引导阶段包含4个小的阶段。</p>
<p>　　首先，计算机要经过初始引导加载器阶段（Initial Boot Loader），在这个阶段里，<br />
NTLDR将计算机微处理器从实模式转换为32位平面内存模式。在实模式中，系统为MS-DOS保<br />
留640kb内存，其余内存视为扩展内存，而在32位平面内存模式中，系统（Windows XP Pr<br />
ofessional）视所有内存为可用内存。接着，NTLDR启动内建的mini-file system driver<br />
s，通过这个步骤，使NTLDR可以识别每一个用NTFS或者FAT文件系统格式化的分区，以便发<br />
现以及加载Windows XP Professional，到这里，初始引导加载器阶段就结束了。</p>
<p>　　接着系统来到了操作系统选择阶段，如果计算机安装了不止一个操作系统（也就是多<br />
系统），而且正确设置了boot.ini使系统提供操作系统选择的条件下，计算机显示器会显<br />
示一个操作系统选单，这是NTLDR读取boot.ini的结果。（至于操作系统选单，由于暂时条<br />
件不够，没办法截图，但是笔者模拟了一个）</p>
<p>　　在boot.ini中，主要包含以下内容：</p>
<p>　　[boot loader]<br />
　　timeout=30<br />
　　default=multi（0）disk（0）rdisk（0）partition（1）\WINDOWS</p>
<p>　　[operating systems]</p>
<p>　　multi（0）disk（0）rdisk（0）partition（1）\WINDOWS="Microsoft Windows XP <br />
Professional" /fastdetect</p>
<p>　　multi（0）disk（0）rdisk（0）partition（2）\WINNT="Windows Windows 2000 Pr<br />
ofessional"</p>
<p>　　其中，multi（0）表示磁盘控制器，disk（0）rdisk（0）表示磁盘，partition（x）<br />
表示分区。NTLDR就是从这里查找Windows XP Professional的系统文件的位置的。（*本文<br />
不会更详细地讲解boot.ini的组成结构，因为其与本主题关系不大，如果想了解，可以到<br />
一些专门的网站处查询相关信息。）如果在boot.ini中只有一个操作系统选项，或者把ti<br />
meout值设为0，则系统不出现操作系统选择菜单，直接引导到那个唯一的系统或者默认的<br />
系统。在选择启动Windows XP Professional后，操作系统选择阶段结束，硬件检测阶段开<br />
始。</p>
<p>　　在硬件检测阶段中，ntdetect.com将收集计算机硬件信息列表并将列表返回到NTLDR，<br />
这样做的目的是便于以后将这些硬件信息加入到注册表HKEY_LOCAL_MACHINE下的hardware<br />
中。<br />
　　硬件检测完成后，进入配置选择阶段。如果计算机含有多个硬件配置文件列表，可以<br />
通过按上下按钮来选择。如果只有一个硬件配置文件，计算机不显示此屏幕而直接使用默<br />
认的配置文件加载Windows XP专业版。</p>
<p>　　引导阶段结束。在引导阶段，系统要用到的文件一共有：NTLDR，Boot.ini，ntdetec<br />
t.com，ntokrnl.exe，Ntbootdd.sys，bootsect.dos（可选的）。</p>
<p>　　c） 加载内核阶段</p>
<p>　　在加载内核阶段，ntldr加载称为Windows XP内核的ntokrnl.exe。系统加载了Window<br />
s XP内核但是没有将它初始化。接着ntldr加载硬件抽象层（HAL，hal.dll），然后，系统<br />
继续加载HKEY_LOCAL_MACHINE\system键，NTLDR读取select键来决定哪一个Control Set将<br />
被加载。控制集中包含设备的驱动程序以及需要加载的服务。NTLDR加载HKEY_LOCAL_MACH<br />
INE\system\service\&#8230;下start键值为0的最底层设备驱动。当作为Control Set的镜像的<br />
Current Control Set被加载时，ntldr传递控制给内核，初始化内核阶段就开始了。 </p>
<p>　　d） 初始化内核阶段</p>
<p>　　在初始化内核阶段开始的时候，彩色的Windows XP的logo以及进度条显示在屏幕中央<br />
，在这个阶段，系统完成了启动的4项任务：</p>
<p>　　内核使用在硬件检测时收集到的数据来创建了HKEY_LOCAL_MACHINE\HARDWARE键。<br />
　　内核通过引用HKEY_LOCAL_MACHINE\system\Current的默认值复制Control Set来创建<br />
了Clone Control Set。Clone Control Set配置是计算机数据的备份，不包括启动中的改<br />
变，也不会被修改。</p>
<p>　　系统完成初始化以及加载设备驱动程序，内核初始化那些在加载内核阶段被加载的底<br />
层驱动程序，然后内核扫描HKEY_LOCAL_MACHINE\system\CurrentControlSet\service\&#8230;<br />
下start键值为1的设备驱动程序。这些设备驱动程序在加载的时候便完成初始化，如果有<br />
错误发生，内核使用ErrorControl键值来决定如何处理，值为3时，错误标志为危机/关键<br />
，系统初次遇到错误会以LastKnownGood Control Set重新启动，如果使用LastKnownGood<br />
&nbsp;Control Set启动仍然产生错误，系统报告启动失败，错误信息将被显示，系统停止启动<br />
；值为2时错误情况为严重，系统启动失败并且以LastKnownGood Control Set重新启动，<br />
如果系统启动已经在使用LastKnownGood值，它会忽略错误并且继续启动；当值是1的时候<br />
错误为普通，系统会产生一个错误信息，但是仍然会忽略这个错误并且继续启动；当值是<br />
0的时候忽略，系统不会显示任何错误信息而继续运行</p>
<p>　　Session Manager启动了Windows XP高级子系统以及服务，Session Manager启动控制<br />
所有输入、输出设备以及访问显示器屏幕的Win32子系统以及Winlogon进程，初始化内核完<br />
毕。</p>
<p>&nbsp;基于x86 系统上 Windows XP Professional 的启动文件</p>
<p>文件名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件所处位置&nbsp;&nbsp;&nbsp; 描述 <br />
Ntldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统分区根目录&nbsp; 操作系统装载器 </p>
<p>Boot.ini&nbsp;&nbsp;&nbsp;&nbsp; 系统分区根目录&nbsp; 该文件指定 Windows XP Professional 的安装路径。对<br />
于多引导系统 Boot.ini 包含一个显示在启动菜单上的操作系统选择菜单。</p>
<p>Bootsect.dos (仅适用于多引导系统) 系统分区根目录&nbsp; Ntldr 将会装载此文件，以读取<br />
可能包含 MS-DOS, Windows 95, Windows 98, or Windows Me 等OS的Windows Xrofessio<br />
nal 多引导系统设定。 Bootsect.dos 包含这些操作系统的引导扇区，文件属性为系统、<br />
隐藏。 </p>
<p>Ntdetect.com&nbsp;&nbsp; 系统分区根目录&nbsp; 此文件将扫描硬件设置信息，并传递给 Ntldr </p>
<p>Ntbootdd.sys&nbsp;&nbsp; 系统分区根目录 (SCSI 或者ATA 等固件本身禁用或者不支持 INT-13 中<br />
断扩展调用的设备需要此文件).&nbsp; 该驱动程序用于访问不使用 BIOS，而连接到 SCSI 或者<br />
&nbsp;ATA 的硬盘驱动器， The contents of this file depend on the startup controller<br />
&nbsp;used. </p>
<p>Ntoskrnl.exe systemroot\System32&nbsp; Windows XP Professional操作系统的核心 (也被叫<br />
做 kernel) 。作为 kernel的一部分，运行在处理器特权模式下的代码，允许直接访问系<br />
统数据和硬件。 <br />
&nbsp;在安装Windows XP Professional 操作系统期间，如果是单处理器系统，setup程序从操<br />
作系统光盘上复制 Ntoskrnl.exe 文件，如果是多处理器系统，Setup 从安装光盘上复制<br />
&nbsp;Ntoskrnlmp.exe 并将它重命名为Ntoskrnl.exe. </p>
<p>Hal.dll systemroot\System32&nbsp; 硬件抽象层动态(HAL)链接库文件。HAL abstracts 从操<br />
作系统提取底层硬件信息，并给相同类型的设备，提供公用编程接口。 <br />
&nbsp;Microsoft&amp;reg; Windows&amp;reg; XP Professional 操作系统光盘包含若干 Hal 文件，Se<br />
tup 将适合您系统硬件设置的文件复制到您的计算机，并重命名为 Hal.dll. </p>
<p>System registry file systemroot\System32\Config\System&nbsp; 此注册表文件包含创建HK<br />
EY_LOCAL_MACHINE\SYSTEM 注册表键值所需要的数据。该键值包含了操作系统启动设备和<br />
系统服务所需要的信息。 </p>
<p>Device drivers systemroot\System32\Drivers&nbsp; 一些硬件设备的驱动程序文件，比如键<br />
盘、鼠标、显卡。 </p>
<p>&nbsp;&nbsp; systemroot是众多环境变量之一，用于将象文件和文件路径这样的字符串关联到变量，<br />
以便 Windows XP Professional应用程序和服务使用。例如，通过使用环境变量，<br />
脚本不同修改就可以运行在不同环境设置的计算机上。您可以通过在命令行执行 <br />
&nbsp;set 命令查看环境变量列表</p>
<p>检测硬件和硬件配置文件<br />
&nbsp;&nbsp;&nbsp; 进入此阶段，Ntldr 启动Ntdetect.com, 后者将执行基础硬件扫描。随后 Ntldr 扫描<br />
&nbsp;Boot.ini 信息，以及保存在注册表中的硬件和软件信息，传送给 Ntoskrnl.exe。Ntdet<br />
ect.com 检测硬件配置信息 (比如 便携计算机上接驳或未接驳设置) 和保存在 Advanced<br />
&nbsp;Configuration and Power Interface (ACPI) 表中的信息。 ACPI 兼容固件允许Window<br />
s XP Professional 检测设备电源管理功能和设备资源需求。</p>
<p>&nbsp;&nbsp;&nbsp; 检测、设置硬件阶段在读取 Boot.ini 并完成其任务后， Ntldr 启动 Ntdetect.com<br />
。在 x86 系统上 Ntdetect.com 调用系统例行程序收集已经安装的硬件信息，并将收集的<br />
信息返回给Ntldr，Ntldr 将这些信息收集后存入内部数据库 ，然后启动 Ntoskrnl.exe <br />
并将信息传递给它。</p>
<p>Ntdetect.com 所收集的硬件设备的信息如下：</p>
<p>信息固件信息，比如日期和时间 <br />
总线和板卡类型 <br />
显卡 <br />
键盘 <br />
通讯端口 <br />
硬盘 <br />
软盘 <br />
输入设备 (比如鼠标) <br />
并行端口 <br />
安装在Industry Standard Architecture (ISA) 总线上的设备<br />
&nbsp;&nbsp; Ntdetect.com 在非ACPI兼容计算机的设备扫描中扮演了重要的角色。因为在这些类型<br />
的计算机上，固件而不是操作系统决定了分配给设备的资源，对于使用ACPI固件的计算机<br />
，Windows XP Professional 对硬件设备分配资源。在这个阶段，Ntdetect.com 收集硬件<br />
信息， Windows XP Professional 为桌面计算机创建一个单独的默认硬件配置文件，而为<br />
便携计算机创建两个缺省的配置文件。对于便携计算机，操作系统基于当前计算机上硬件<br />
状态选择适当的配置文件。</p>
<p>桌面型计算机. Profile 1 <br />
便携式计算机. <br />
Docked Profile <br />
Undocked Profile<br />
硬件配置文件对于便携式计算机是非常有用的，因为这些计算机的硬件状态通常都不是静<br />
态的，启动的时候，没有列表在特定的硬件配置文件中的设备驱动是不会被加载的。<br />
&nbsp;&nbsp; 关于创建和使用硬件配置文件的信息，请参考Windows XP Professional 帮助和支持中<br />
心，也可以参考知识库文档 225810, "How to Create Hardware Profiles on Windows 2<br />
000?Based Mobile Computers," 查找此文档，请查询Web Resources 页面 http://www.m<br />
icrosoft.com/windows/reskits/webresources 上的知识库链接，同时您也可以查看"Man<br />
aging Devices" 和 "Supporting Mobile Users" <br />
&nbsp;&nbsp; 核心装载阶段Ntldr 负责将 Windows 核心层 (Ntoskrnl.exe) 和硬件抽象层 (HAL) 装<br />
载到内存。您的系统所使用的 Hal.dll 文件是可以发生变化的。在安装期间，Windows X<br />
P Professional 安装程序从若干 HAL 文件中选择一个复制到系统，(请参看表28.2 关于<br />
这些文件的列表) 并重名为Hal.dll。</p>
<p>在设备管理器中查看计算机描述 </p>
<p>在运行对话框，输入 devmgmt.msc，点击确定。 <br />
在设备管理器展开计算机察看您计算机的描述。 <br />
通过比较设备管理器中的描述和下面表 28.2中的描述, 您可以确定从 Windows XP Profe<br />
ssional 操作系统光盘复制到您系统中的HAL文件</p>
<p>Table 28.2&nbsp;&nbsp; 关于不同 Hal.dll 文件的描述</p>
<p>设备管理器中计算机的描述&nbsp; 复制的HAL文件 <br />
ACPI 多处理器 PC Halmacpi.dll <br />
ACPI 单处理器 PC Halaacpi.dll <br />
Advanced Configuration and Power Interface (ACPI) PC Halacpi.dll <br />
MPS 多处理器 PC Halmps.dll <br />
MPS 单处理器 PC Halapic.dll <br />
标准 PC Hal.dll <br />
Compaq SystemPro 多处理器或者完全兼容 Halsp.dll </p>
<p><br />
核心层kernel 和硬件抽象层HAL 初始化一组软件组件，他们统称为windows 执行体。Win<br />
dows 执行体扫描储存在注册表control sets中的信息，并启动服务和驱动程序。 </p>
<p>关于Windows executive services, 请查看 "Common Stop Messages for Troubleshooti<br />
ng" </p>
<p>控制集Control Sets<br />
Ntldr 从 HKEY_LOCAL_MACHINE\SYSTEM 注册表子键中读取相关信息，该子健中的数据创建<br />
于\System32\Config\ System 文件,故而 Ntldr 能够决定哪些设备驱动在系统启动时装载<br />
。 通常，注册表中存在几个control sets, 其后面的序号取决于系统设定多长时间变更一<br />
次。。</p>
<p>提示：</p>
<p>如非必要不要直接编辑注册表。注册表编辑器绕开了系统保护机制，您的修改有可能会破<br />
坏系统，严重者甚至需要重新安装 Windows。如果你必须编辑注册表，请事先作备份，并<br />
详细阅读 Microsoft&amp;reg; Windows&amp;reg; 2000 Server Resource Kit 中关于 Registry <br />
Reference 的章节http://www.microsoft.com/windows/reskits/webresources.<br />
典型的注册表控制集 control set 子键如下：</p>
<p>\CurrentControlSet, 一个注册在\Select\Current 项中，指向 ControlSetxxx 子键的指<br />
针 (xxx 代表一个 control set 编号, 比如 001)&nbsp; <br />
\Clone, 一份 \CurrentControlSet的拷贝，当您每次启动计算机的时候创建。（gnaw072<br />
5注：此处原文如此，有待考证） <br />
\Select, 包含如下键值： <br />
Default, 指针指向系统指定用户下次登陆所使用的控制集编号 (比如 001=ControlSet00<br />
1)。 如果没有错误发生，或者并非由 LastKnownGood 启动项所设置，此 control set 编<br />
号将为 Default, Current和 LastKnownGood 注册项所影响 (假定当前用户可以成功登录<br />
)<br />
Current, 指向此次用于启动系统的控制集&nbsp; <br />
Failed, 指向没有成功启动 Windows XP Professional 的控制集。当使用 LastKnownGoo<br />
d 选项启动系统时，此项被更新 （gnaw0725注：表示 Windows XP 在其中保存失败启动产<br />
生的数据的控件组。 此控件组在用户第一次调用&#8220;最近一次的正确配置&#8221;选项之前并不实<br />
际存在。）&nbsp; <br />
LastKnownGood, 指向上次用户会话所使用的控制集 。当用户登录的时候，LastKnownGoo<br />
d 控制集被前一次用户会话使用的设置信息所更新。<br />
除非您从Windows Advanced Options菜单中选择Last Known Good Configuration，Ntldr<br />
&nbsp;将使用Default 键值所标示的控制集。</p>
<p>核心层使用Ntldr 提供的内部数据结构创建 HKEY_LOCAL_MACHINE\HARDWARE 子键，其中包<br />
含在系统启动阶段收集的硬件信息。这些数据包含信息包括各种硬件组件和分配给每个设<br />
备的系统资源。您可以通过查看在启动过程中显示的进度指示器来监控核心层加载过程 关<br />
于 Last Known Good Configuration的相关信息，您可以查阅 "Tools for Troubleshoot<br />
ing" </p>
<p>Windows XP Professional 支持设备扩展。新的或者更新的驱动程序并不存在于 Windows<br />
&nbsp;XP Professional 操作系统光盘上，而是由于硬件厂商提供。驱动程序是核心模式组件，<br />
需要Drivers are kernel-mode components required by devices to function within <br />
an operating system. 服务是支持操作系统功能和应用程序的组件。与用户应用程序相比<br />
，服务可以运行在一个不同的上下文，通常不会提供用户可以设置的选项。服务，比如脱<br />
机打印 Print Spooler，不需要用户登录即可运行，而且与登陆到系统的用户无关。Wind<br />
ows XP Professional 驱动程序和服务系统文件通常被存放在 systemroot\System32 和 <br />
systemroot\System32\Drivers 目录下，以 .exe, .sys, or .dll 等扩展名保存。</p>
<p>驱动程序也是服务，因此在核心层初始化期间，Ntldr 和 Ntoskrnl.exe 按照存储在HKEY<br />
_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\servicename 注册表子键中的数值<br />
来确定装载的驱动程序和服务次序。例如，Ntldr 首先搜索Services 子键中 Start 值为<br />
&nbsp;0的服务，比如硬盘控制器。当 Ntldr 启动 Ntoskrnl.exe后，一个Ntoskrnl.exe 组件搜<br />
索并启动驱动程序，比如网络协议，这些启动项 Start 值为 1.</p>
<p>Table 28.3 ，列出了 Start 项的值（十进制）。Boot 类型的驱动 (Start 值为0的项) <br />
文件系统驱动程序的Start值始终为0，因为启动 Windows XP Professional 需要它们的支<br />
持。</p>
<p>表 28.3 &lt;服务名&gt; Start项的赋值 <br />
值 Start类型 关于 Start 项赋值的描述 <br />
0 Boot 基于x86系统 Ntldr 或者Itanium IA64ldr上的固件调用模式指定装载的驱动，如<br />
果没有错误发生，核心层Kernel将启动该驱动程序 <br />
1 System 指定在系统核心层 Kernel 初始化期间被 Windows XP Professional boot dri<br />
vers 所调用的驱动程序 <br />
2 Auto load 指定在系统启动时被会话管理器 (Smss.exe)或者服务控制器 (Services.ex<br />
e)所加载的驱动程序或者服务。 <br />
3 Load on demand 指定一个通过用户、进程或者其他服务手动启动的驱动程序或者服务 </p>
<p>4 Disabled 指定一个禁止（不启动）的驱动程序或者服务。 </p>
<p><br />
表 28.4 列出了Type 项的一些值（十进制） </p>
<p>表 28.4&nbsp;&nbsp; &lt;服务名&gt; Type 项的赋值</p>
<p>值&nbsp; Type 项赋值描述 <br />
1 指定一个核心设备驱动程序 <br />
2 指定一个文件系统驱动程序 (也是一个核心设备驱动程序) <br />
4 指定参数传递给设备驱动程序 <br />
16 指定一个遵循服务控制协议的服务，该服务可以独立运行在一个进程中，且可以为服务<br />
控制器所启动 <br />
32 指定一个可以和其他服务共享进程的服务 </p>
<p><br />
一些驱动程序和服务需要在启动之前确定之间的相互依赖关系。通过查看HKEY_LOCAL_MAC<br />
HINE\SYSTEM\CurrentControlSet\Services\servicename下DependOnGroup和 DependOnSe<br />
rvice&nbsp; 项 ，您可以找到这个依存关系的列表。关于使用依赖关系阻止或者延迟驱动程序<br />
或者服务启动的信息，请查看 "Temporarily Disabling Services" 。该服务子键也包含<br />
了影响驱动程序和服务如何加载的信息，表 28.5 中描述了其中的一部分。</p>
<p>表 28.5&nbsp;&nbsp; 注册表其他 &lt;服务名&gt; 项</p>
<p>项 描述 <br />
DependOnGroup 此组中所描述的项目，至少有一个在当前服务装载前必须被加载。子键 S<br />
YSTEM\CurrentControlSet\Control\ServiceGroupOrder 包含服务组装载次序 <br />
DependOnService 此列表中描述的服务，必须在当前服务之前加载。 <br />
Description 组件描述 <br />
DisplayName 指定组件的显示名称 <br />
ErrorControl 控制一个驱动程序错误是需要系统使用 LastKnownGood 控制集还是提示一<br />
个错误停止信息。 <br />
如果值为 0x0 (忽略，没有错误报告), 不会显示警告信息，继续执行启动。 <br />
如果值为 0x1 (普通，报告错误), 将错误记录到系统日志并提示警告信息，但继续启动过<br />
程。 <br />
如果值为 0x2 (严重), 将事件记录到系统日志，使用 LastKnownGood 设置，重新启动系<br />
统，执行启动过程。 <br />
如果值为 0x3 (关键), 将事件记录到系统日志，使用 LastKnownGood 设置，重新启动系<br />
统。如果当前启动已经使用 LastKnownGood 设定，则显示错误停止信息。 <br />
Group 指定驱动程序或者服务隶属的组。此项设定允许驱动程序或者服务同步启动（比入<br />
：文件系统驱动程序）注册表子键 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Con<br />
trol\ServiceGroupOrder 中的 List 项指定了组项启动顺序。 <br />
ImagePath 如果存在ImagePath项，该项用于标示驱动程序或者服务的路径和文件名。 您<br />
可以使用Windows Explorer 核实这些路径和文件名。 <br />
ObjectName 指定一个对象名。如果 Type 项指定一个 Windows XP Professional 服务，<br />
那么它就代表服务运行时用于登陆的帐户名。 <br />
Tag 指定一个驱动程序在驱动程序组中的启动顺序。 </p>
<p><br />
会话管理器<br />
当所有标志为 Boot 和 Startup 数据类型的注册表子键执行完成后， kernel 开始加载会<br />
话管理器 Session Manager，由它 (Smss.exe) 执行后续重要的初始化工作，比如：</p>
<p>创建系统环境变量 <br />
启动Windows 子系统核心保护模式 (通过 systemroot\System32\Win32k.sys 实现), 这将<br />
&nbsp;Windows XP Professional 从文本模式切换至图形模式。基于Windows的应用程序都运行<br />
在 Windows 子系统上，这个环境下允许应用程序访问操作系统功能函数，比如在屏幕上显<br />
示信息。 <br />
启动 Windows 子系统用户模式部分 (通过 systemroot\System32\Csrss.exe 实现). <br />
启动登陆管理器 (通过&nbsp; systemroot\System32\Winlogon.exe 实现). <br />
创建辅助虚拟内存页文件 <br />
为存放在下列子键中的文件列表，执行延迟的重命名操作。 HKEY_LOCAL_MACHINE\SYSTEM<br />
\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations. 比如：<br />
当您安装了一个新的驱动程序或者应用程序后，系统可能会提示您重新启动，以便 Windo<br />
ws XP Professional 能够替换当前正在使用的文件。<br />
Windows 子系统和基于它执行的应用程序是用户模式进程，它们不能直接访问硬件和设备<br />
驱动。用户模式进程执行优先级低于核心进程，当操作系统需要更多内存的时候，它可以<br />
将被用户模式下进程使用的内存缓存到虚拟页面文件。关于用户模式和核心模式组件的信<br />
息，请参考"Common Stop Messages for Troubleshooting" 。</p>
<p>会话管理器Session Manager 将搜索注册表，以获得服务信息，注册表键值如下：</p>
<p>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 包含一个在<br />
服务装载之前运行的命令列表&nbsp; Autochk.exe 工具由 BootExecute 项的值和存储在 Memo<br />
ry Management 子键中的虚拟内存 (页面文件) 设置所指定。Autochk, 是 Chkdsk 工具的<br />
一个版本，如果操作系统检测到一个文件系统错误，需要在完成启动过程之前进行修复，<br />
那么就会在启动的时候运行它。关于 Autochk 和 Chkdsk, "Troubleshooting Disks and<br />
&nbsp;File Systems" 。 <br />
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems<br />
&nbsp;包含一个有效子系统的列表。比如 Csrss.exe 包含Windows 子系统中的一部分，用户模<br />
式。&nbsp; <br />
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\servicename. 服务控制管理<br />
器（Service Control Manager） 初始化那些设置为启动自动加载的服务。<br />
登录阶段在此阶段Windows 子系统启动 Winlogon.exe，此模块为系统服务，以完成用户的<br />
登入或者登出的动作。 Winlogon.exe 所完成的功能如下：</p>
<p>启动服务子系统 (Services.exe), 也称为服务控制管理器 (SCM). <br />
启动本地安全性授权进程 Local Security Authority (LSA) (Lsass.exe). <br />
在出现开始登陆提示时，侦测 CTRL+ALT+DEL 组合键。 <br />
图形化识别和验证 Graphical Identification and Authentication (GINA) 组件获取用<br />
户名和密码，并将这些信息传送给 LSA 进行安全验证。如果用户提供有效验证，那么通过<br />
使用Kerberos V 5 验证协议或者 NTLM 可以或者访问权限。关于安全组件的信息，比如 <br />
LSA, Kerberos V5 协议或者 NTLM, Distributed Systems Guide of the Microsoft&amp;reg<br />
; Windows&amp;reg; 2000 Server Resource Kit.</p>
<p>当服务控制管理器Service Control Manager 初始化自动装载服务项和驱动时，Winlogon<br />
&nbsp;开始初始化安全和认证组件，当用户登录后，系统进行如下动作：</p>
<p>更新控制集Control sets 。 控制集为 LastKnownGood 注册项所影响，并随 Clone 项中<br />
的内容一同更新。Clone, 是CurrentControlSet 项的一份拷贝, 当您每次启动计算机时被<br />
创建。当用户登录的时候，LastKnownGood 控制集被前一次用户会话使用的设置信息所更<br />
新。 <br />
实施策略。组策略策略设定开始实施于用户和计算机帐户。关于组策略的相关信息，请查<br />
看"Planning Deployments," "Managing Desktops," 和 "Authorization and Access Co<br />
ntrol" ，以及Windows 2000 Server Resource Kit中分布式系统指南中关于 "Group Pol<br />
icy" 的章节，同时您也可以参考其网站资源站点 http://www.microsoft.com/windows/r<br />
eskits/webresources 上关于 Change and Configuration Management Deployment Guid<br />
e 的链接。 <br />
运行启动程序。 Windows XP Professional 启动登陆脚本，启动程序组，并且启动在如下<br />
注册表子键和启动目录所关联的服务项: <br />
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Runonce <br />
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer<br />
\Run <br />
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run <br />
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Run <br />
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run <br />
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce <br />
systemdrive\Documents and Settings\All Users\Start Menu\Programs\Startup <br />
systemdrive\Documents and Settings\username\Start Menu\Programs\Startup <br />
windir\Profiles\All Users\Start Menu\Programs\Startup <br />
windir\Profiles\username\Start Menu\Programs\Startup <br />
windir\Profiles 目录文件夹仅存在于从Windows NT 4.0升级的系统上。</p>
<p>直到用户成功登陆到计算机后，Windows XP Professional 启动过程最终完成。</p>
<p>即插即用检测即插即用检测不与登陆过程同步运作，它依赖于系统固件，硬件，设备驱动<br />
程序以及操作系统功能，从而能够检测和枚举新的设备。 Windows XP Professional 为使<br />
用ACPI固件的设备优化即插即用支持，并且允许增强功能，比如硬件资源共享。</p>
<p>当即插即用能够很好协调工作时，Windows XP Professional 能够在最小用户参与的前提<br />
下，检测到新的设备，分配系统资源，安装或者请求驱动程序。ACPI 特性对于移动用户是<br />
非常有用的，这些特性可以很好的支持待机、休眠、冷热插拔等功能。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/wenhl5656/aggbug/205198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-06-01 20:20 <a href="http://www.blogjava.net/wenhl5656/archive/2008/06/01/205198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(zz)理工科大学排名</title><link>http://www.blogjava.net/wenhl5656/archive/2008/06/01/205197.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Sun, 01 Jun 2008 12:18:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/archive/2008/06/01/205197.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 北京大学 ★★★★★ 理科第一，中国科学院院士数量全国第一，科学家的摇篮。数<br />
学、物理、化学、生物四个基础科学的实力均居全国高校之首。北京大学医学部的分数线<br />
仅次于北京大学校本部和清华大学。<br />
　　2 哈尔滨工业大学 ★★★★★ 工科第一，哈天研究全国第一，工程师的摇篮。近年<br />
来逐渐加强理科的建设，加上强大的工科背景，理科实力大有上升。<br />
　　3 复旦大学 ★★★★★ 在这里读书是许多南方人的梦想，地处上海，是文理基础综<br />
合性大学，历史悠。 <br />
　　4 浙江大学 ★★★★☆ 理号称&#8220;小清华&#8221;，合并了杭州大学、浙江医科大学和浙江<br />
农业大学后更是实力大增，成为全国惟一一所兼具理工农医的大学。 <br />
　　5 南京大学 ★★★★☆ 虽然有些理科专业有点冷门（比如天文学），但绝对是一流<br />
的。<br />
　　6 中国科学技术大学 ★★★☆☆ 虽然地处合肥，掩不住其大家本色，毕竟是科技部<br />
直办高校。<br />
　　7 上海交通大学 ★★★☆☆ 地处上海宝地，势头完全压倒交通大学家族的老大哥西<br />
安交通大学。并且工科实力非常雄厚。 <br />
　　8 北京航空航天大学 ★★★☆☆ 它的崛起，相当原因是由于地处天子脚下吧。不过<br />
自身的理工科实力确实很强，尤其是自动化之类的工科。 <br />
　　9 国防科学技术大学 ★★☆☆☆ 计算机类专业出色，其中计算机科学技术超过清华<br />
大学居全国第一，由于是军校，不用支持高额的学杂费。 <br />
　　10 华中科技大学 ★★☆☆☆ 华中地区理工类大学的老大，有一些其他著名的工科大<br />
学没有的工科专业。
<img src ="http://www.blogjava.net/wenhl5656/aggbug/205197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-06-01 20:18 <a href="http://www.blogjava.net/wenhl5656/archive/2008/06/01/205197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>断点续传的原理</title><link>http://www.blogjava.net/wenhl5656/articles/205193.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Sun, 01 Jun 2008 12:11:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/articles/205193.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实断点续传的原理很简单，就是在Http的请求上和一般的下载有所不同而已。打个比方，浏览器请求服务器上的一个文时，所发出的请求如下：<br />
<br />
&nbsp;&nbsp; 假设服务器域名为<a href="http://www.sjtu.edu.cn/">www.sjtu.edu.cn</a>，文件名为down.zip。<br />
<br />
GET /down.zip HTTP/1.1<br />
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, plication/vnd.ms-powerpoint, */*<br />
Accept-Language: zh-cn<br />
Accept-Encoding: gzip, deflate<br />
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)<br />
Connection: Keep-Alive<br />
<br />
服务器收到请求后，按要求寻找请求的文件，提取文件的信息，然后返回给浏览器，返回信息如下：<br />
<br />
200<br />
Content-Length=106786028<br />
Accept-Ranges=bytes<br />
Date=Mon, 30 Apr 2001 12:56:11 GMT<br />
ETag=W/"02ca57e173c11:95b"<br />
Content-Type=application/octet-stream<br />
Server=Microsoft-IIS/5.0<br />
Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT<br />
<br />
所谓断点续传，也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给Web服务器的时候要多加一条信息——从哪里开始。<br />
<br />
下面是用自己编的一个"浏览器"来传递请求信息给Web服务器，要求从2000070字节开始。<br />
<br />
GET /down.zip HTTP/1.0<br />
User-Agent: Firefox<br />
RANGE: bytes=2000070-<br />
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2<br />
<br />
仔细看一下就会发现多了一行RANGE: bytes=2000070-；这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传，前面的字节不用传了。<br />
服务器收到这个请求以后，返回的信息如下：<br />
<br />
206<br />
Content-Length=106786028<br />
Content-Range=bytes 2000070-106786027/106786028<br />
Date=Mon, 30 Apr 2001 12:55:20 GMT<br />
ETag=W/"02ca57e173c11:95b"<br />
Content-Type=application/octet-stream<br />
Server=Microsoft-IIS/5.0<br />
Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT<br />
<br />
和前面服务器返回的信息比较一下，就会发现增加了一行：<br />
<br />
Content-Range=bytes 2000070-106786027/106786028<br />
<br />
返回的代码也改为206了，而不再是200了。<br />
知道了以上原理，就可以进行断点续传的编程了。<br />
 <img src ="http://www.blogjava.net/wenhl5656/aggbug/205193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-06-01 20:11 <a href="http://www.blogjava.net/wenhl5656/articles/205193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javadoc～javah～HtmlConverter~</title><link>http://www.blogjava.net/wenhl5656/articles/205191.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Sun, 01 Jun 2008 12:02:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/articles/205191.html</guid><description><![CDATA[<strong style="color: red">javadoc</strong>.exe <br />
<br />
用法：javadoc [options] [packagenames] [sourcefiles] [classnames] [@files] <br />
-overview &lt;file&gt; 读取 HTML 格式的概述文档 <br />
-public 仅显示 public 类和成员 <br />
-protected 显示 protected/public 类和成员（缺省） <br />
-package 显示 package/protected/public 类和成员 <br />
-private 显示所有类和成员 <br />
-help 显示命令行选项 <br />
-doclet &lt;class&gt; 通过候选 doclet 生成输出 <br />
-docletpath &lt;path&gt; 指定 doclet 类文件的查找位置 <br />
-sourcepath &lt;pathlist&gt; 指定源文件的查找位置 <br />
-classpath &lt;pathlist&gt; 指定用户类文件的查找位置 <br />
-exclude &lt;pkglist&gt; Specify a list of packages to exclude <br />
-subpackages &lt;subpkglist&gt; Specify subpackages to recursively load <br />
-breakiterator Compute 1st sentence with BreakIterator <br />
-bootclasspath &lt;pathlist&gt; 覆盖自举类加载器所加载的类文件的位置 <br />
-source &lt;release&gt; Provide source compatibility with specified release <br />
-extdirs &lt;dirlist&gt; 覆盖已安装的扩展的位置 <br />
-verbose 有关 Javadoc 所做工作的输出信息 <br />
-locale &lt;name&gt; 所用的 Locale，例如 en_US 或 en_US_WIN <br />
-encoding &lt;name&gt; 源文件编码名称 <br />
-J&lt;flag&gt; 将 &lt;flag&gt; 直接传给运行时系统 <br />
<br />
由标准 doclet 提供： <br />
-d &lt;directory&gt; 输出文件的目标目录 <br />
-use 创建类和包的用法页 <br />
-version 包含 @version 段 <br />
-author 包含 @author 段 <br />
-docfilessubdirs Recursively copy doc-file subdirectories <br />
-splitindex 将索引分为每个字母对应一个文件 <br />
-windowtitle &lt;text&gt; 文档的浏览器窗口标题 <br />
-doctitle &lt;html-code&gt; 包含包索引页（首页）的标题 <br />
-header &lt;html-code&gt; 包含每一页的页眉文本 <br />
-footer &lt;html-code&gt; 包含每一页的页脚文本 <br />
-bottom &lt;html-code&gt; 包含每一页的页底文本 <br />
-link &lt;url&gt; Create links to javadoc output at &lt;url&gt; <br />
-linkoffline &lt;url&gt; &lt;url2&gt; Link to docs at &lt;url&gt; using package list at &lt;url2&gt; <br />
-excludedocfilessubdir &lt;name1&gt;:.. Exclude any doc-files subdirectories with given name. <br />
-group &lt;name&gt; &lt;p1&gt;:&lt;p2&gt;.. Group specified packages together in overview page <br />
-nocomment Supress description and tags, generate only declarations. <br />
-nodeprecated 不包含 @deprecated 信息 <br />
-noqualifier &lt;name1&gt;:&lt;name2&gt;:... Exclude the list of qualifiers from the output. <br />
-nosince Do not include @since information <br />
-nodeprecatedlist 不生成不鼓励使用的列表 <br />
-notree 不生成类层次 <br />
-noindex 不生成索引 <br />
-nohelp 不生成帮助链接 <br />
-nonavbar 不生成导航栏 <br />
-quiet Do not display status messages to screen <br />
-serialwarn Generate warning about @serial tag <br />
-tag &lt;name&gt;:&lt;locations&gt;:&lt;header&gt; Specify single argument custom tags <br />
-taglet The fully qualified name of Taglet to register <br />
-tagletpath The path to Taglets <br />
-charset &lt;charset&gt; Charset for cross-platform viewing of generated documentation. <br />
-helpfile &lt;file&gt; 包含帮助链接功能链接到目标的文件 <br />
-linksource Generate source in HTML <br />
-stylesheetfile &lt;path&gt; 改变所生成文档的样式的文件 <br />
-docencoding &lt;name&gt; 输出编码名称 <br />
<br />
<br />
<strong style="color: red">javah</strong>.exe <br />
<br />
用法：javah [options] &lt;classes&gt; <br />
<br />
其中 [options] 包括： <br />
<br />
-help 打印该帮助信息 <br />
-classpath &lt;path&gt; 类的加载路径 <br />
-bootclasspath &lt;path&gt; 自举类的加载路径 <br />
-d &lt;dir&gt; 输出目录 <br />
-o &lt;file&gt; 输出文件（仅能使用 -d 或 -o 之一） <br />
-jni 生成 JNI 风格的头文件（缺省） <br />
-old 生成 JDK1.0 风格的头文件 <br />
-stubs 生成 stubs 文件 <br />
-version 打印版本信息 <br />
-verbose 输出有关本命令所做工作的信息 <br />
-force 始终写输出文件 <br />
指定 &lt;classes&gt; 时必须使用全名（例如 java.lang.Object）。<br />
<br />
<strong style="color: red">HtmlConverter</strong>.exe <br />
<br />
用法：HtmlConverter [-option1 value1 [-option2 value2 [...]]] [-simulate] [filespecs] <br />
<br />
其中，选项包括： <br />
<br />
-source: 获取源文件的路径。 缺省值： &lt;userdir&gt; <br />
-dest: 写入已转换文件的路径。 缺省值： &lt;userdir&gt; <br />
-backup: 写备份文件的路径。 缺省值： &lt;dirname&gt;_BAK <br />
-f: 强制覆写备份文件。 <br />
-subdirs: 应处理子目录中的文件。 <br />
-template: 模板文件的路径。 如果不确定，请使用缺省值。 <br />
-log: 写日志的路径。 如果没有提供，则不会写入任何日志。 <br />
-progress: 转换时显示进度。 缺省值： true <br />
-simulate: 在没有进行转换时显示特定于转换的信息。 <br />
-latest: 使用最新的 JRE 支持发行版 mimetype。 <br />
-gui: 显示转换程序的图形用户界面。 <br />
<br />
filespecs: 用空格分开的文件说明列表。 缺省值： "*.html *.htm" （需要引号)<br />
&nbsp;<br />
<strong><span style="color: red"><strong>native2ascii</strong> </span></strong><br />
<br />
功能说明： <br />
将含有本地编码字符（既非 Latin1 又非 Unicode 字符）的文件转换为 Unicode 编码字符的文件。 <br />
语法： <br />
native2ascii [options] [inputfile [outputfile]] <br />
补充说明： <br />
Java 编译器和其它 Java 工具只能处理含有 Latin-1 和/或 Unicode 编码（udddd 记号）字符的文件。native2ascii 将含有其它字符编码的文件转换成含 Latin-1 和/或 Unicode 编码字符的文件。若省略 outputfile，则使用标准输出设备输出。此外，如果也省略 inputfile，则使用标准输入设备输入。 <br />
命令选项 <br />
-reverse 执行相反的操作：将含 Latin-1 和/或 Unicode 编码字符的文件转换成含本地编码字符的文件。 <br />
-encoding[encoding_name] 指定转换过程使用的编码名称。缺省的编码从系统属性 file.encoding 中得到。 <br />
<img src ="http://www.blogjava.net/wenhl5656/aggbug/205191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-06-01 20:02 <a href="http://www.blogjava.net/wenhl5656/articles/205191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javac～appletviewer～jar</title><link>http://www.blogjava.net/wenhl5656/articles/205190.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Sun, 01 Jun 2008 11:57:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/articles/205190.html</guid><description><![CDATA[补充详细： <br />
javac.exe <br />
<br />
用法：javac &lt;选项&gt; &lt;源文件&gt; <br />
可能的选项包括： <br />
-g 生成所有调试信息 <br />
-g:none 生成无调试信息 <br />
-g:{lines,vars,source} 生成只有部分调试信息 <br />
-O 优化；可能妨碍调试或者增大类文件 <br />
-nowarn 生成无警告 <br />
-verbose 输出关于编译器正在做的信息 <br />
-deprecation 输出使用了不鼓励使用的API的源程序位置 <br />
-classpath &lt;路径&gt; 指定用户类文件的位置 <br />
-sourcepath &lt;路径&gt; 指定输入源文件的位置 <br />
-bootclasspath &lt;路径&gt; 覆盖自举类文件的位置 <br />
-extdirs &lt;目录(多个)&gt; 覆盖安装的扩展类的位置 <br />
-d &lt;目录&gt; 指定输出类文件的位置 <br />
-encoding &lt;编码&gt; 指定源文件中所用的字符集编码 <br />
-target &lt;版本&gt; 生成指定虚拟机版本的类文件 <br />
-help Print a synopsis of standard options <br />
<br />
appletviewer.exe <br />
<br />
用法：appletviewer &lt;options&gt; url <br />
其中，&lt;options&gt; 包括： <br />
-debug 在 Java 调试器中启动 applet 小程序查看器 <br />
-encoding &lt;encoding&gt; 指定由 HTML 文件使用的字符编码 <br />
-J&lt;runtime flag&gt; 向 Java 解释器传递参数 <br />
-J 选项不是标准选项，如有更改，不另行通知。 <br />
<br />
==================== <br />
jar.exe <br />
用法：jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ... <br />
选项： <br />
-c 创建新的存档 <br />
-t 列出存档内容的列表 <br />
-x 展开存档中的命名的（或所有的〕文件 <br />
-u 更新已存在的存档 <br />
-v 生成详细输出到标准输出上 <br />
-f 指定存档文件名 <br />
-m 包含来自标明文件的标明信息 <br />
-0 只存储方式；未用ZIP压缩格式 <br />
-M 不产生所有项的清单（manifest〕文件 <br />
-i 为指定的jar文件产生索引信息 <br />
-C 改变到指定的目录，并且包含下列文件： <br />
如果一个文件名是一个目录，它将被递归处理。 <br />
清单（manifest〕文件名和存档文件名都需要被指定，按'm' 和 'f'标志指定的相同顺序。 <br />
示例1：将两个class文件存档到一个名为 'classes.jar' 的存档文件中： <br />
jar cvf classes.jar Foo.class Bar.class <br />
示例2：用一个存在的清单（manifest）文件 'mymanifest' 将 foo/ 目录下的所有 <br />
文件存档到一个名为 'classes.jar' 的存档文件中： <br />
jar cvfm classes.jar mymanifest -C foo/ . <br />
<img src ="http://www.blogjava.net/wenhl5656/aggbug/205190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-06-01 19:57 <a href="http://www.blogjava.net/wenhl5656/articles/205190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK安装后bin文件夹下的exe文件</title><link>http://www.blogjava.net/wenhl5656/articles/205187.html</link><dc:creator>Dest</dc:creator><author>Dest</author><pubDate>Sun, 01 Jun 2008 11:47:00 GMT</pubDate><guid>http://www.blogjava.net/wenhl5656/articles/205187.html</guid><description><![CDATA[<font style="color: #000000" color="#6b8e23">安装JDK后，JAVAHOME下会出现许多可执行的exe文件，它们的用途如下：<br />
<br />
&nbsp;&nbsp;&nbsp; javac：Java编译器，将Java源代码换成字节代&nbsp;<br />
&nbsp;&nbsp;&nbsp; java：Java解释器，直接从类文件执行Java应用程序代码&nbsp;<br />
&nbsp;&nbsp;&nbsp; appletviewer(小程序浏览器)：一种执行HTML文件上的Java小程序类的Java浏览器&nbsp;<br />
&nbsp;&nbsp;&nbsp; javadoc：根据Java源代码及其说明语句生成的HTML文档&nbsp;<br />
&nbsp;&nbsp;&nbsp; jdb：Java调试器，可以逐行地执行程序、设置断点和检查变量&nbsp;<br />
&nbsp;&nbsp;&nbsp; javah：产生可以调用Java过程的C过程，或建立能被Java程序调用的C过程的头文件&nbsp;<br />
&nbsp;&nbsp;&nbsp; Javap：Java反汇编器，显示编译类文件中的可访问功能和数据，同时显示字节代码含义&nbsp;<br />
&nbsp;&nbsp;&nbsp; jar：多用途的存档及压缩工具，是个java应用程序，可将多个文件合并为单个JAR归档文件。&nbsp;<br />
&nbsp;&nbsp;&nbsp; htmlConverter——命令转换工具。&nbsp;<br />
&nbsp;&nbsp;&nbsp; native2ascii——将含有不是Unicode或Latinl字符的的文件转换为Unicode编码字符的文件。&nbsp;<br />
&nbsp;&nbsp;&nbsp; serialver——返回serialverUID。语法：serialver [show] 命令选项show是用来显示一个简单的界面。输入完整的类名按Enter键或"显示"按钮，可显示serialverUID。 <br />
<br />
它们具体说明见系列文章。<br />
</font>
<img src ="http://www.blogjava.net/wenhl5656/aggbug/205187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wenhl5656/" target="_blank">Dest</a> 2008-06-01 19:47 <a href="http://www.blogjava.net/wenhl5656/articles/205187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>