<?xml version="1.0" encoding="GB2312"?>  
<rss version="2.0" 
xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
xmlns:admin="http://webns.net/mvcb/" 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
  
<channel> 
<title><![CDATA[谁与争锋刀剑啸（诚挚结交天下好友）]]></title> 
<link>http://gophinight.bokee.com/index.html</link> 
<description><![CDATA[程序员一个底层的群体，有人把程序员跟妓女相比，把我们的工作比作是卖身，诚然，有一定的道理。我的路，从一行行代码中走过来，从一个个Bug中走过来，从一天天进步中走过来。回首望去，满目沧然。
今天的我，算成功，还是失败，算优秀，还是平庸，我想，作为一个程序员，我是平庸的，但作为一个朋友，我是优秀的。
以我为友者，我欢迎，鄙视我者，我亦欢迎，支持使我进步，鄙视使我自省。
我自是那秋风中一把晃悠晃悠的刀，划开厚厚的泥土。

有愿意和我交流的朋友可以给我发Mail：gophinight@163.com]]></description> 
<dc:language>zh-cn</dc:language> 
<dc:creator>gophinight@qq.com</dc:creator> 
<dc:date>2008-07-10T13:54:19Z</dc:date> 
<admin:generatorAgent rdf:resource="http://blog.bokee.com.com" /> 

<item> 
<title><![CDATA[用字符串进行加法和乘法的算法]]></title> 
<link>http://gophinight.bokee.com/6761474.html</link> 
<description><![CDATA[<p>在J2me开发中我们有可能会遇到需要将一个很大很大的数进行运算的情况，这个所谓很大就是说数的位数已经远远超过了int，甚至double的情况，因此是不能直接进行运算的，只能将这个数转化成字符串来进行运算，下面就给出加法和乘法的代码，并由之推出的一个大数阶乘的代码</p><p>&amp;nbsp;/*字符串加法*/<br />&amp;nbsp;public String StringAdd(String s1,String s2)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;String smin,smax;<br />&amp;nbsp;&amp;nbsp;if(s1.length()&amp;gt;s2.length())<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;smax=s1;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;smin=s2;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;smax=s2;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;smin=s1;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;int a,b,c=0,d,p;<br />&amp;nbsp;&amp;nbsp;d=smax.length()-1;<br />&amp;nbsp;&amp;nbsp;p=smin.length()-1;<br />&amp;nbsp;&amp;nbsp;String result=&amp;quot;&amp;quot;;<br />&amp;nbsp;&amp;nbsp;while(d&amp;gt;=0)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(p&amp;gt;=0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a=Integer.parseInt(smin.substring(p,p+1));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a=0;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;b=Integer.parseInt(smax.substring(d,d+1));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;c=a+b+c;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;result=c%10+result;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;c=c/10;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;p--;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;d--;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;if(c!=0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;result=String.valueOf(c)+result;<br />&amp;nbsp;&amp;nbsp;return result;<br />&amp;nbsp;}</p><p>&amp;nbsp;/*字符串乘法*/<br />&amp;nbsp;public String StringMul(String s1,String s2)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;String smin,smax;<br />&amp;nbsp;&amp;nbsp;if(s1.length()&amp;gt;s2.length())<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;smax=s1;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;smin=s2;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;smax=s2;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;smin=s1;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;int a,b,c=0;<br />&amp;nbsp;&amp;nbsp;String result=&amp;quot;0&amp;quot;,tempResult=&amp;quot;&amp;quot;,tempZero=&amp;quot;&amp;quot;;<br />&amp;nbsp;&amp;nbsp;for(int i=smin.length()-1;i&amp;gt;=0;i--)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;b=Integer.parseInt(smin.substring(i,i+1));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(b!=1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int j=smax.length()-1;j&amp;gt;=0;j--)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a=Integer.parseInt(smax.substring(j,j+1));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c=a*b+c;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tempResult=c%10+tempResult;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c=c/10;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(c!=0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tempResult=c+tempResult;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tempResult=smax+tempResult;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;result=StringAdd(tempResult,result);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;tempZero+=&amp;quot;0&amp;quot;;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;c=0;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;tempResult=tempZero;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;return result;<br />&amp;nbsp;}</p><p>&amp;nbsp;/*大数阶乘*/<br />&amp;nbsp;public String stepMul(int x)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;return x==1?&amp;quot;1&amp;quot;:(this.StringMul(String.valueOf(x),stepMul(x-1)));<br />&amp;nbsp;}</p><p /><p>运算得到的结果自然也是一个字符串</p>]]></description> 
<guid isPermaLink="false">6761474@http://gophinight.bokee.com/</guid> 
<dc:subject>J2ME技术性文章</dc:subject> 
<dc:date>2008-07-16T09:46:34Z</dc:date> 
</item> 
<item> 
<title><![CDATA[低级界面中实现输入法]]></title> 
<link>http://gophinight.bokee.com/6277574.html</link> 
<description><![CDATA[<p>呵呵，在游戏或者应用开发中，在高级界面和低级界面之间的切换总是一件让人头疼的事情，高级界面方便，但是难看，低级界面美观，但是一直以来因为在输入法上存在困难（主要是指中文），所以很多产品都是使用了两种界面并存的方式，但我一直想放弃高级界面，采用低级界面来保持产品界面风格的统一，经过N天的努力，终于整成了一套比较好用的输入法，从此可以告别高级界面了，^_^</p><p>先讲讲这个输入法的原理，首先程序会从字库文件中将拼音和相应的文字读进内存，其中拼音会放在一个数组里，用来查找，然后字库里的字会以拼音为Key存入一个哈希表，查找的时候，首先根据按键上的字母组合在拼音表里查找是否有适配的拼音，如果有完整适配的拼音则直接从哈希表从取出相应的文字以供选择，下面就给出相应的代码</p><p>public class InputMethod implements Const<br />{<br />&amp;nbsp;Hashtable hashtable=new Hashtable();<br />&amp;nbsp;String[] wordKey;<br />&amp;nbsp;int[] inputKey=new int[10];<br />&amp;nbsp;int currentPos;<br />&amp;nbsp;String[] currentInputPad;//当前的输入显示板<br />&amp;nbsp;public Vector keyAvailable=new Vector(0,1);<br />&amp;nbsp;Vector wordsBuffer;//上一级的读音的缓存<br />&amp;nbsp;int select,charSelect;<br />&amp;nbsp;int screenW,screenH;<br />&amp;nbsp;int num_row;//每行的字數<br />&amp;nbsp;int charPage;//頁數<br />&amp;nbsp;public String inputChar;//輸入的字符<br />&amp;nbsp;int inputMode;//输入类型　０字母　１数字　２拼音<br />&amp;nbsp;String[] inputModeTxt={&amp;quot;abc&amp;quot;,&amp;quot;123&amp;quot;,&amp;quot;拼音&amp;quot;};<br />&amp;nbsp;public String content[]={&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;};//输入的内容，第一维是实际内容，第二维和第三维是用于有光标定位显示的内容<br />&amp;nbsp;public int charPos;//光标位置<br />&amp;nbsp;long time1,time2;//按键的时间<br />&amp;nbsp;int charKeyPos;//字母的切换<br />&amp;nbsp;String[][] charKey=new String[][]{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;},<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;f&amp;quot;},<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;i&amp;quot;},<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;j&amp;quot;,&amp;quot;k&amp;quot;,&amp;quot;l&amp;quot;},<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;m&amp;quot;,&amp;quot;n&amp;quot;,&amp;quot;o&amp;quot;},<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;p&amp;quot;,&amp;quot;q&amp;quot;,&amp;quot;r&amp;quot;,&amp;quot;s&amp;quot;},<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;t&amp;quot;,&amp;quot;u&amp;quot;,&amp;quot;v&amp;quot;},<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;w&amp;quot;,&amp;quot;x&amp;quot;,&amp;quot;y&amp;quot;,&amp;quot;z&amp;quot;}<br />&amp;nbsp;};<br />&amp;nbsp;public InputMethod(int w,int h)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;screenW=w;<br />&amp;nbsp;&amp;nbsp;screenH=h;<br />&amp;nbsp;&amp;nbsp;num_row=(w-10)/20;<br />&amp;nbsp;&amp;nbsp;charPage=0;<br />&amp;nbsp;&amp;nbsp;cls();<br />&amp;nbsp;&amp;nbsp;readWords();<br />&amp;nbsp;}<br />&amp;nbsp;/*清空缓存*/<br />&amp;nbsp;public void cls()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;currentPos=0;<br />&amp;nbsp;&amp;nbsp;wordsBuffer=new Vector(0,1);<br />&amp;nbsp;&amp;nbsp;for(int i=0;i&amp;lt;inputKey.length;i++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;inputKey[i]=-1;<br />&amp;nbsp;}<br />&amp;nbsp;/*清空输入内容*/<br />&amp;nbsp;public void clsContent()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;content=new String[]{&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;};<br />&amp;nbsp;&amp;nbsp;charPos=0;<br />&amp;nbsp;&amp;nbsp;charSelect=0;<br />&amp;nbsp;}<br />&amp;nbsp;public void doUp()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;if(select&amp;gt;0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;select--;<br />&amp;nbsp;&amp;nbsp;currentInputPad=null;<br />&amp;nbsp;}<br />&amp;nbsp;public void doDown()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;if(select&amp;lt;keyAvailable.size()-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;select++;<br />&amp;nbsp;&amp;nbsp;currentInputPad=null;<br />&amp;nbsp;}<br />&amp;nbsp;public void drawInput(Graphics g)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;int starty;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(inputMode==2)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(keyAvailable!=null&amp;amp;&amp;amp;keyAvailable.size()&amp;gt;0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;starty=240-keyAvailable.size()*20;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(keyAvailable.size()&amp;gt;0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PaintCanvas.drawBox(g, 0, starty, 50,keyAvailable.size()*20, 0xffff00);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(0);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=0;i&amp;lt;keyAvailable.size();i++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(i==select)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(0x00ff00);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(0x0000ff);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g.fillRect(0,starty+i*18,50,18);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(-1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String key=(String)keyAvailable.elementAt(i);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g.drawString(key,10,starty+i*18,0);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(i==select)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*查找相应的拼音*/<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int m=0;m&amp;lt;wordKey.length;m++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*如果完全适配，就从哈希表里取出相应的字*/<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(key.equals(wordKey[m]))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentInputPad=(String[])hashtable.get(key);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(currentInputPad!=null)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;starty=screenH-65;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;drawTextBox(g,0xefefef,0x121212,0x2d3f4d,2,starty,screenW-4,25,2,0);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(0xffff00);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=charPage*num_row;i&amp;lt;(charPage+1)*num_row;i++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(i+&amp;quot;.&amp;quot;+charPage+&amp;quot;.&amp;quot;+num_row+&amp;quot;.&amp;quot;+charSelect);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(i&amp;gt;currentInputPad.length-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(i==charSelect)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(-1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g.drawRect(3+(i-charPage*num_row)*20,starty+1,16,20);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(0xffff00);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g.drawString(currentInputPad[i],5+(i-charPage*num_row)*20,starty+2,0);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;PaintCanvas.drawStringShadow(g,-1,0,0,inputModeTxt[inputMode],w,0,24);<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;輸入法出錯&amp;quot;+e.toString());<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;public void drawTextBox(Graphics g,int color1,int color2,int color3,int stx,int sty,int bw,int bh,int boardW,int type)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;if(type==0)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(color1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.fillRect(stx-boardW,sty-boardW,bw+2*boardW,bh+2*boardW);&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(color2);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.fillRect(stx,sty,bw+boardW,bh+boardW);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(color3);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.fillRect(stx,sty,bw,bh);&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(color2);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.fillRect(stx-boardW,sty-boardW,bw+2*boardW,bh+2*boardW);&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(color1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.fillRect(stx,sty,bw+boardW,bh+boardW);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.setColor(color3);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;g.fillRect(stx,sty,bw,bh);&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;}<br />&amp;nbsp;public void keyPressed(int i)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;time2=System.currentTimeMillis();<br />&amp;nbsp;&amp;nbsp;if(i==MIDKEY)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(inputMode==2)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if((inputChar=getChar())!=null)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cls();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;keyAvailable.removeAllElements();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentInputPad=null;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;if(i==SOFTRIGHTKEY)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;backWord();<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;cls();<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;keyAvailable=new Vector(0,1);<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;currentInputPad=null;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;if(i&amp;gt;=48&amp;amp;&amp;amp;i&amp;lt;58)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(inputMode==2&amp;amp;&amp;amp;i&amp;gt;=50)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(checkWord(i-50))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inputKey[currentPos++]=i-50;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentInputPad=null;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select=0;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(inputMode==1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inputChar=&amp;quot;&amp;quot;+(i-48);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(inputMode==0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(i&amp;gt;=50)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;按键时间&amp;quot;+time2+&amp;quot;.&amp;quot;+time1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if((time2-time1)&amp;lt;500)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;连续按键&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charKeyPos++;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(charKeyPos==charKey[i-50].length)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charKeyPos=0;<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;内容长度&amp;quot;+content[0].length()+&amp;quot;光标位置&amp;quot;+charPos);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(charPos==content[0].length())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;1&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content[0]=content[0].substring(0,charPos-1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charPos--;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;2&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content[0]=content[0].substring(0,charPos-1)+content[0].substring(charPos,content[0].length());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;refreshContent();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inputChar=charKey[i-50][charKeyPos];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;if(i==UPKEY)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;doUp();<br />&amp;nbsp;&amp;nbsp;if(i==DOWNKEY)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;doDown();<br />&amp;nbsp;&amp;nbsp;if(i==LEFTKEY)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(charSelect&amp;gt;0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charSelect--;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(charSelect%num_row==num_row-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charPage--;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;if(i==RIGHTKEY)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(charSelect&amp;lt;currentInputPad.length-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charSelect++;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(charSelect%num_row==0&amp;amp;&amp;amp;charSelect!=0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charPage++;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;/*切换输入法*/<br />&amp;nbsp;&amp;nbsp;if(i==POUNDKEY)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;inputMode++;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(inputMode==inputModeTxt.length)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inputMode=0;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;/*删除*/<br />&amp;nbsp;&amp;nbsp;if(i==CKEY)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(charPos&amp;gt;=2&amp;amp;&amp;amp;PaintCanvas.checkFace(content[0].substring(charPos-2,charPos))&amp;gt;-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content[0]=content[0].substring(0, charPos-2)+content[0].substring(charPos,content[0].length());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charPos-=2;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(charPos&amp;gt;0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(charPos==content[0].length())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content[0]=content[0].substring(0,charPos-1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content[0]=content[0].substring(0, charPos-1)+content[0].substring(charPos,content[0].length());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charPos--;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;refreshContent();<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;time1=time2;<br />&amp;nbsp;}<br />&amp;nbsp;/*回退*/<br />&amp;nbsp;public void backWord()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;if(wordsBuffer.size()&amp;gt;0)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;keyAvailable=(Vector)wordsBuffer.elementAt(wordsBuffer.size()-1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;wordsBuffer.removeElementAt(wordsBuffer.size()-1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;currentInputPad=null;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;public void checkWords(Vector temp,String key,int ik)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;int p;<br />&amp;nbsp;&amp;nbsp;for(p=0;p&amp;lt;charKey[ik].length;p++)<br />&amp;nbsp;&amp;nbsp;{</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;int m;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;for(m=0;m&amp;lt;wordKey.length;m++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(wordKey[m].indexOf(key+charKey[ik][p])==0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp.addElement(new String(key+charKey[ik][p]));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;/*检查是否有合适的拼音*/<br />&amp;nbsp;public boolean checkWord(int ik)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;Vector temp=new Vector(0,1);<br />&amp;nbsp;&amp;nbsp;String key=&amp;quot;&amp;quot;;<br />&amp;nbsp;&amp;nbsp;if(keyAvailable.size()&amp;gt;0)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=0;i&amp;lt;keyAvailable.size();i++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;key=(String)keyAvailable.elementAt(i);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkWords(temp,key,ik);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;checkWords(temp,key,ik);&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;if(temp.size()&amp;gt;0)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;wordsBuffer.addElement(keyAvailable);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;keyAvailable=temp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;return false;<br />&amp;nbsp;}<br />&amp;nbsp;/*从字库里读取文件*/<br />&amp;nbsp;public void readWords()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;InputStream is;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;String[] words;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;int fontNum=0;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;is=getClass().getResourceAsStream(&amp;quot;/input/chars.txt&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuffer sb=new StringBuffer();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;int c;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;int pos=0;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;while((c=is.read())!=-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(c);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(c=='\n')<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(pos==0&amp;amp;&amp;amp;fontNum==0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fontNum=Integer.parseInt(sb.toString());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wordKey=new String[fontNum];<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;拼音表长度:&amp;quot;+wordKey.length);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String key;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[] data1=new byte[sb.toString().length()];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=0;i&amp;lt;data1.length;i++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data1[i]=(byte)sb.charAt(i);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String s=new String(data1,&amp;quot;UTF-8&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;key=s.substring(0, s.indexOf(&amp;quot;*&amp;quot;)).toLowerCase();<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(key);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words=new String[s.length()-s.indexOf(&amp;quot;*&amp;quot;)-1];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int j=0;j&amp;lt;words.length;j++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words[j]=s.substring(s.indexOf(&amp;quot;*&amp;quot;)+1+j,s.indexOf(&amp;quot;*&amp;quot;)+2+j);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hashtable.put(key, words);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wordKey[pos++]=key;&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb=new StringBuffer();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(c!=0x0d)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append((char)c);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;String key;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[] data1=new byte[sb.toString().length()];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=0;i&amp;lt;data1.length;i++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data1[i]=(byte)sb.charAt(i);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;String s=new String(data1,&amp;quot;UTF-8&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;key=s.substring(0, s.indexOf(&amp;quot;*&amp;quot;));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;words=new String[s.length()-s.indexOf(&amp;quot;*&amp;quot;)-1];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int j=0;j&amp;lt;words.length;j++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words[j]=s.substring(s.indexOf(&amp;quot;*&amp;quot;)+1+j,s.indexOf(&amp;quot;*&amp;quot;)+2+j);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;hashtable.put(key, words);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;wordKey[pos++]=key;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;读取字库出错&amp;quot;+e.toString());<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;public String getChar()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;if(currentInputPad!=null)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return currentInputPad[charSelect];<br />&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;}<br />&amp;nbsp;public void setInputMode(int type)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;inputMode=type;<br />&amp;nbsp;}<br />&amp;nbsp;public int getInputMode()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;return inputMode;<br />&amp;nbsp;}<br />&amp;nbsp;public void refreshContent()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;if(content[0].length()&amp;gt;0)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(charPos==0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content[1]=&amp;quot; &amp;quot;+content[0];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content[2]=&amp;quot;|&amp;quot;+content[0];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(charPos==content[0].length())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content[1]=content[0]+&amp;quot; &amp;quot;;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content[2]=content[0]+&amp;quot;|&amp;quot;;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content[1]=content[0].substring(0,charPos)+&amp;quot; &amp;quot;+content[0].substring(charPos,content[0].length());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content[2]=content[0].substring(0,charPos)+&amp;quot;|&amp;quot;+content[0].substring(charPos,content[0].length());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;System.out.println(content[0]);<br />&amp;nbsp;&amp;nbsp;System.out.println(content[1]);<br />&amp;nbsp;&amp;nbsp;System.out.println(content[2]);<br />&amp;nbsp;}<br />&amp;nbsp;/*移动光标*/<br />&amp;nbsp;public void moveCharPos(int direct)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;if(direct==0)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(charPos&amp;gt;2)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(content[0].substring(charPos-2,charPos));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(PaintCanvas.checkFace(content[0].substring(charPos-2,charPos))&amp;gt;-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charPos-=2;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charPos--;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(charPos&amp;gt;0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charPos--;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else <br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(charPos&amp;lt;content[0].length()-2)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(PaintCanvas.checkFace(content[0].substring(charPos+1,charPos+3))&amp;gt;-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charPos+=2;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charPos++;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(charPos&amp;lt;content[0].length())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;charPos++;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;refreshContent();<br />&amp;nbsp;}<br />}</p><p>这个代码实现了用＃号键切换英文，数字，拼音之间的输入法切换（不好意思，暂时没有加入标点输入），然后在自己的Canvas界面中通过如下按键控制</p><p>&amp;nbsp;/*输入法的按键*/<br />&amp;nbsp;public void keyPressedInput(int i)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;if(!chooseFace&amp;amp;&amp;amp;down&amp;amp;&amp;amp;imt.keyAvailable.size()==0)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;chooseFace=true;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;faceNo=7;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else if(!chooseFace&amp;amp;&amp;amp;left&amp;amp;&amp;amp;imt.keyAvailable.size()==0)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.moveCharPos(0);<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else if(!chooseFace&amp;amp;&amp;amp;right&amp;amp;&amp;amp;imt.keyAvailable.size()==0)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.moveCharPos(1);<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else if(chooseFace)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(left)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(faceNo==0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;faceNo=face.rows*face.columns-1;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;faceNo--;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(right)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(faceNo==face.rows*face.columns-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;faceNo=0;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;faceNo++;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(up)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chooseFace=false;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(fire||softLeft)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.content[0]+=faceSign[faceNo];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.charPos+=2;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.refreshContent();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else if(softRight)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(imt.keyAvailable==null||imt.keyAvailable.size()==0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;drawMessage=-1;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.clsContent();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.keyPressed(-7);<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else if(softLeft)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(imt.keyAvailable.size()==0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(imt.content[0]!=null&amp;amp;&amp;amp;imt.content[0].length()&amp;gt;0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendMessage(drawMessage);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setNotice(&amp;quot;对不起，你输入的信息为空&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;drawMessage=-1;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.keyPressed(i);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(imt.inputChar!=null)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(imt.content[0]==null||imt.content[0].length()==0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.content[0]=imt.inputChar;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.content[0]=imt.content[0].substring(0,imt.charPos)+imt.inputChar+imt.content[0].substring(imt.charPos, imt.content[0].length());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.inputChar=null;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imt.charPos++;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;imt.refreshContent();<br />&amp;nbsp;}</p><p>这里面有一些我自己的工程中要用到的类，大家看的时候注意区分一下，呵呵，比如chooseFace是为了我们这边需要插入表情头像用的，大家可以不用，绘制的时候，交替显示inputmethod里的content[1]和content[2]，确定需要用到输入内容的时候，调用inputmethod里的content[0]就行了。</p><p>另外给一下字库文件的格式</p><p>392<br />A*啊阿腌<br />Ai*爱矮挨哎碍癌艾唉哀蔼隘埃皑呆嫒暧捱</p><p>字库文件是一个TXT文件，第一行的数字标明这个字库里有多少拼音，然后每一行是拼音和字库，这个文件可以自己随意定义。</p><p>OK，就说这么多吧，大家有看不明白的地方，可以找我交流一下，谢谢。</p>]]></description> 
<guid isPermaLink="false">6277574@http://gophinight.bokee.com/</guid> 
<dc:subject>J2ME技术性文章</dc:subject> 
<dc:date>2007-05-16T14:25:57Z</dc:date> 
</item> 
<item> 
<title><![CDATA[常用的排序算法（包括冒泡排序，选择排序，插入排序，希尔排序，快速排序)]]></title> 
<link>http://gophinight.bokee.com/6190469.html</link> 
<description><![CDATA[<p>排序算法在程序中会用到很多，这里介绍几种常见的排序方法以及比较</p><p>冒泡排序：对一个队列里的数据，挨个进行轮询和交换，每次轮询出一个当前最大或者最小的值放在队尾，然后继续下次轮询，轮询长度-1，就跟冒泡一样，所以称为冒泡排序，运算时间复杂度N平方</p><p>选择排序：对一个队列里的数据，选出当前最大或者最小的值，然后将他与队首的数据交换，然后从第二个开始，进行相同的操作，运算时间复杂度N平方，但由于他不像冒泡一样需要不停的交换位置，所以会比冒泡快一些</p><p>插入排序：对一个队列里的数据，从第二个开始，与此位置之前的数据进行比较，形成局部有序的队列，循环此操作，直到队尾，运算时间复杂度依然为N平方，但他由于保证了局部的有序性，所以比较的次数会更少一些，相对前两种会更快</p><p>希尔排序：其实就是用步长控制的插入排序，希尔排序通过加大插入排序中元素之间的间隔，并在这些有间隔的元素中进行插入排序，从而让数据项可以大幅度移动，这样的方式可以使每次移动之后的数据离他们在最终序列中的位置相差不大，保证数据的基本有序，大大提升了排序速度，运算时间复杂度N*logN</p><p>快速排序：对一个队列，以他队尾的数据为基准值，先划分成两块数据，一块都大于这个值，一块小于这个值，然后对这两块进行同样的操作，这是最快的排序方法，运算时间复杂度N*logN</p><p>下面是代码：</p><p>&amp;nbsp;public static void sort(int[] a)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;long time1,time2;<br />&amp;nbsp;&amp;nbsp;int c;<br />&amp;nbsp;&amp;nbsp;time1=System.currentTimeMillis();<br />//&amp;nbsp;&amp;nbsp;/*冒泡排序*/<br />//&amp;nbsp;&amp;nbsp;for(int i=a.length-1;i&amp;gt;1;i--)<br />//&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int j=0;j&amp;lt;i;j++)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />//<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(a[j]&amp;lt;a[j+1])<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c=a[j];<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a[j]=a[j+1];<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a[j+1]=c;<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />//&amp;nbsp;&amp;nbsp;}<br />//&amp;nbsp;&amp;nbsp;/*选择排序*/<br />//&amp;nbsp;&amp;nbsp;int pos=0;<br />//&amp;nbsp;&amp;nbsp;for(int i=0;i&amp;lt;a.length-2;i++)<br />//&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int j=i;j&amp;lt;a.length-1;j++)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(a[pos]&amp;lt;a[j+1])<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos=j+1;<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;c=a[i];<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;a[i]=a[pos];<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;a[pos]=c;<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;pos=i+1;<br />//&amp;nbsp;&amp;nbsp;}<br />//&amp;nbsp;&amp;nbsp;/*插入排序*/<br />//&amp;nbsp;&amp;nbsp;for(int i=1;i&amp;lt;a.length;i++)<br />//&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;c=a[i];<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;int m=i-1;<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;while(m&amp;gt;=0&amp;amp;&amp;amp;a[m]&amp;lt;c)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a[m+1]=a[m];<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m--;<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;a[m+1]=c;<br />//&amp;nbsp;&amp;nbsp;}<br />//&amp;nbsp;&amp;nbsp;/*希尔排序*/<br />//&amp;nbsp;&amp;nbsp;int h=1;<br />//&amp;nbsp;&amp;nbsp;int m=0;<br />//&amp;nbsp;&amp;nbsp;while(3*h+1&amp;lt;a.length)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;h=3*h+1;<br />//&amp;nbsp;&amp;nbsp;while(h&amp;gt;0)<br />//&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=h;i&amp;lt;a.length;i++)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c=a[i];<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m=i-h;<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(m&amp;gt;=0&amp;amp;&amp;amp;a[m]&amp;lt;c)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a[m+h]=a[m];<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m-=h;<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a[m+h]=c;<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;h=(h-1)/3;<br />//&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;/*快速排序*/<br />&amp;nbsp;&amp;nbsp;provide(a,0,a.length-1);<br />&amp;nbsp;&amp;nbsp;time2=System.currentTimeMillis();<br />&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;time:&amp;quot;+(time2-time1));<br />&amp;nbsp;}<br />&amp;nbsp;/*递归调用划分*/<br />&amp;nbsp;public static void provide(int[] a,int left,int right)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(right&amp;lt;=left)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*设置基准点*/<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int prov=a[right];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*取得划分中断点*/<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int par=partitionIt(a,left,right,prov);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*对划分后的两边再次划分*/<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;provide(a,left,par-1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;provide(a,par+1,right);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;eer:&amp;quot;+left+&amp;quot;.&amp;quot;+right);<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;/*划分算法*/<br />&amp;nbsp;public static int partitionIt(int[] a,int left,int right,int prov)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;/*设置左右端点的指针*/<br />&amp;nbsp;&amp;nbsp;int leftP=left-1;<br />&amp;nbsp;&amp;nbsp;int rightP=right;<br />&amp;nbsp;&amp;nbsp;int c;//用于交换的中间变量<br />&amp;nbsp;&amp;nbsp;/*当左右指针未相遇时继续操作*/<br />&amp;nbsp;&amp;nbsp;while(leftP&amp;lt;rightP)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;/*当左指针的数据小于基准值时跳出*/<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;while(leftP&amp;lt;a.length-1&amp;amp;&amp;amp;a[++leftP]&amp;gt;prov)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;/*当右指针的数据大于基准值时跳出*/<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;while(rightP&amp;gt;leftP&amp;amp;&amp;amp;a[--rightP]&amp;lt;prov)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;/*左右指针都停下时交换数据*/<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;c=a[leftP];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;a[leftP]=a[rightP];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;a[rightP]=c;<br />&amp;nbsp;&amp;nbsp;}&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;/*划分结束，将基准点与指针的相遇点交换*/<br />&amp;nbsp;&amp;nbsp;c=a[rightP];<br />&amp;nbsp;&amp;nbsp;a[rightP]=a[right];<br />&amp;nbsp;&amp;nbsp;a[right]=c;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;return leftP;<br />&amp;nbsp;}</p>]]></description> 
<guid isPermaLink="false">6190469@http://gophinight.bokee.com/</guid> 
<dc:subject>J2ME技术性文章</dc:subject> 
<dc:date>2007-03-28T18:16:33Z</dc:date> 
</item> 
<item> 
<title><![CDATA[成功是等不来的]]></title> 
<link>http://gophinight.bokee.com/6075312.html</link> 
<description><![CDATA[<p>&amp;nbsp; 成功是什么，鬼才知道，对不同的人来说，成功具有不同的含义，然而如何才能够获得成功应该是大家都关心的话题，包括我自己，但我自己都是迷茫的，我向往成功，却也不停的错过去争取成功的机会，回想再三，其实就是自己怎一个懒字了得。</p><p>&amp;nbsp;&amp;nbsp; 很多日子之前就曾经说过要学这样学那样，结果三年光阴已经逝去，我却依旧是一个除了J2me之外啥都不会的半残，而且根本没有一点想学习的念头，而身边的兄弟们却一个个都开始身杯十八般武艺，有时候听他们讨论技术问题，我基本上是云里雾里，感觉自己就跟被埋进了土堆里的死人一样，已经快被时代所抛弃。</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; 我曾说自己不愿意再做技术，想往管理的路上发展，然而当机会真的来到我面前的时候，当某公司力邀我去做他们开发团队的Leader的时候，我却萎缩了，我当然会找种种理由来解释自己不能接受这个职位，然而我自己心里最清楚，我是害怕，我没有任何一点这方面的经验，我害怕自己做不了会对人不好交待，我怕自己丢人，然而为什么我做不到呢，还不是因为我没有好好充电么，经验原本就是在实践中积累的，而我却浪费了这么多时间，我这时候才知道，YY是开心的，然而当现实来到你跟前你却依旧只能YY而不敢接受的时候，你真的就是个天杀的贱人。</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; 成功是等不来的，2007年春节马上就到了，新的一年又该拉开大幕，人都在渐渐老去，再不花时间学习，那成功就永远只能成为你枕边的一个梦了，也许还带着些许的口水...</p>]]></description> 
<guid isPermaLink="false">6075312@http://gophinight.bokee.com/</guid> 
<dc:subject>情感生活</dc:subject> 
<dc:date>2007-01-29T09:55:26Z</dc:date> 
</item> 
<item> 
<title><![CDATA[J2me如何播放声音]]></title> 
<link>http://gophinight.bokee.com/5952623.html</link> 
<description><![CDATA[<p>在手机应用或者手机游戏中都会用到音效，所以如何播放音效是程序应该解决的问题，现在的音效一般有四种，amr,mid,wav,mp3，对J2me来说，最适用的是mid音效，下面给出的代码是我的声音播放类，适用于四种音效格式，在创建播放器的时候提供了两种方式，一种是直接读取资源文件的创建方式，一种是先从本地或者网络获取到包含声音的流byte[]的创建方式</p><p>/*手机博客客户端.声音类<br />开发：李果<br />开发开始日期：２００６年５月８日<br />*/<br />import javax.microedition.media.*;<br />import java.io.*;<br />public class soundPlayer<br />{&amp;nbsp;<br />&amp;nbsp;public String pType;//手机型号&amp;nbsp;<br />&amp;nbsp;public final String[] mediaType=new String[]{&amp;quot;audio/x-wav&amp;quot;,&amp;quot;audio/midi&amp;quot;,&amp;quot;audio/mpeg&amp;quot;,&amp;quot;audio/amr&amp;quot;};&amp;nbsp;<br />&amp;nbsp;public soundPlayer(String s)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;pType=s;<br />&amp;nbsp;}<br />&amp;nbsp;<br />&amp;nbsp;/*从字节数组里获取输入流*/<br />&amp;nbsp;public InputStream getInputStream(byte[] data)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;ByteArrayInputStream bis=new ByteArrayInputStream(data);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return (InputStream)bis;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;public Player createPlayer(InputStream is,String t,int loop)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;Player player;<br />&amp;nbsp;&amp;nbsp;if(is!=null)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(t.equals(&amp;quot;mid&amp;quot;))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player=Manager.createPlayer(is,mediaType[1]);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(t.equals(&amp;quot;wav&amp;quot;))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player=Manager.createPlayer(is,mediaType[0]);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(t.equals(&amp;quot;mp3&amp;quot;))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player=Manager.createPlayer(is,mediaType[2]);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(t.equals(&amp;quot;amr&amp;quot;))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;player=Manager.createPlayer(is,mediaType[3]);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;player.setLoopCount(loop);&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;return player;&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;}<br />&amp;nbsp;/*创建播放器*/<br />&amp;nbsp;public Player createPlayer(String s,int loop)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;Player player;<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;InputStream is=getClass().getResourceAsStream(s);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;String t=s.substring(s.indexOf('.')+1,s.length());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(t.equals(&amp;quot;mid&amp;quot;))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;player=Manager.createPlayer(is,mediaType[1]);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(t.equals(&amp;quot;wav&amp;quot;))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;player=Manager.createPlayer(is,mediaType[0]);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(t.equals(&amp;quot;mp3&amp;quot;))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;player=Manager.createPlayer(is,mediaType[2]);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(t.equals(&amp;quot;amr&amp;quot;))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;player=Manager.createPlayer(is,mediaType[3]);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;player.setLoopCount(loop);&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;return player;<br />&amp;nbsp;}<br />&amp;nbsp;/*播放声音*/<br />&amp;nbsp;public void playSound(Player p)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;//System.out.println(p.getState());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(p.getState()!=400)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;p.start();<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;/*暂停声音*/<br />&amp;nbsp;public void pauseSound(Player p)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(p.getState()==400)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;p.stop();<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;/*停止声音*/<br />&amp;nbsp;public void stopSound(Player p)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(p.getState()==400)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;p.stop();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!pType.equals(&amp;quot;NOKIA&amp;quot;))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;p.deallocate();<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(e);<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;/*关闭声音*/<br />&amp;nbsp;public void closeSound(Player p)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;stopSound(p);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;p.close();<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />}</p>]]></description> 
<guid isPermaLink="false">5952623@http://gophinight.bokee.com/</guid> 
<dc:subject>J2ME技术性文章</dc:subject> 
<dc:date>2006-12-13T14:06:07Z</dc:date> 
</item> 
<item> 
<title><![CDATA[jsr75相关操作代码新版本]]></title> 
<link>http://gophinight.bokee.com/5952611.html</link> 
<description><![CDATA[<p>这个版本比之前那个代码多了如下内容：</p><p>1.增加了机型判断，增加了两个方法用以直接读取手机的图片文件和铃声文件</p><p>2.列表方法增加了根目录查看</p><p>3.完善了PIM读取方法，只读取电话本里的联系人姓名和电话</p><p>4.完善了写文件操作，在非强制写入的情况下做了异常判断</p><p>如下代码里的注释部分是我自己用来调试用的，可以不要</p><p>/*文件系统类<br />开发：李果<br />开发开始日期：2006年12月11日<br />*/<br />import javax.microedition.io.*;<br />import javax.microedition.io.file.*;<br />import java.io.*;<br />import java.util.*;<br />import javax.microedition.pim.*;<br />public class fileSystem<br />{<br />&amp;nbsp;int fileSize;//文件总大小<br />&amp;nbsp;int currentProgress;//读取进度<br />&amp;nbsp;String platform;<br />&amp;nbsp;String message;<br />&amp;nbsp;String imageFilePath;<br />&amp;nbsp;String soundFilePath;<br />&amp;nbsp;public static final String S40_DEVICE[]={&amp;quot;2610&amp;quot;,&amp;quot;2855&amp;quot;,&amp;quot;2865&amp;quot;,&amp;quot;3152&amp;quot;,&amp;quot;3155&amp;quot;,&amp;quot;5140&amp;quot;,&amp;quot;5200&amp;quot;,&amp;quot;5300&amp;quot;,&amp;quot;6020&amp;quot;,&amp;quot;6060&amp;quot;,&amp;quot;6080&amp;quot;,&amp;quot;6085&amp;quot;,&amp;quot;6101&amp;quot;,&amp;quot;6102&amp;quot;,&amp;quot;6103&amp;quot;,&amp;quot;6111&amp;quot;,&amp;quot;6125&amp;quot;,&amp;quot;6126&amp;quot;,&amp;quot;6131&amp;quot;,&amp;quot;6133&amp;quot;,&amp;quot;6136&amp;quot;,&amp;quot;6151&amp;quot;,&amp;quot;6152&amp;quot;,&amp;quot;6155&amp;quot;,&amp;quot;6155&amp;quot;,&amp;quot;6165&amp;quot;,&amp;quot;6170&amp;quot;,&amp;quot;6230&amp;quot;,&amp;quot;6233&amp;quot;,&amp;quot;6234&amp;quot;,&amp;quot;6235&amp;quot;,&amp;quot;6255&amp;quot;,&amp;quot;6265&amp;quot;,&amp;quot;6270&amp;quot;,&amp;quot;6280&amp;quot;,&amp;quot;6282&amp;quot;,&amp;quot;6288&amp;quot;,&amp;quot;6822&amp;quot;,&amp;quot;7260&amp;quot;,&amp;quot;7270&amp;quot;,&amp;quot;7360&amp;quot;,&amp;quot;7370&amp;quot;,&amp;quot;7373&amp;quot;,&amp;quot;7390&amp;quot;,&amp;quot;8800&amp;quot;,};&amp;nbsp;<br />&amp;nbsp;public fileSystem()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;platform = System.getProperty(&amp;quot;microedition.platform&amp;quot;);<br />&amp;nbsp;&amp;nbsp;if(platform.startsWith(&amp;quot;SonyEricsson&amp;quot;))<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp; &amp;nbsp;&amp;nbsp; imageFilePath=&amp;quot;c:/pictures/&amp;quot;;<br />&amp;nbsp; &amp;nbsp;&amp;nbsp; soundFilePath=&amp;quot;c:/sounds/&amp;quot;;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }<br />&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; if(platform.startsWith(&amp;quot;Nokia&amp;quot;)) <br />&amp;nbsp;&amp;nbsp;&amp;nbsp; {<br />&amp;nbsp;&amp;nbsp; &amp;nbsp;boolean isS40=false;<br />&amp;nbsp; &amp;nbsp;&amp;nbsp; for(int i=0;i&amp;lt;S40_DEVICE.length;i++) <br />&amp;nbsp; &amp;nbsp;&amp;nbsp; {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(platform.startsWith(&amp;quot;Nokia&amp;quot;.concat(S40_DEVICE[i]))) <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; isS40=true;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(isS40) <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imageFilePath=&amp;quot;C:/predefgallery/predefphotos/&amp;quot;;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; soundFilePath=&amp;quot;C:/predefgallery/predefrecordings/&amp;quot;;<br />&amp;nbsp;&amp;nbsp; &amp;nbsp;}<br />&amp;nbsp;&amp;nbsp; &amp;nbsp;else <br />&amp;nbsp;&amp;nbsp; &amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imageFilePath=&amp;quot;C:/Data/Images/&amp;quot;;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; soundFilePath=&amp;quot;C:/Data/Sounds/Digital/&amp;quot;;<br />&amp;nbsp;&amp;nbsp; &amp;nbsp;}<br />&amp;nbsp; &amp;nbsp;}<br />&amp;nbsp;&amp;nbsp; else <br />&amp;nbsp;&amp;nbsp; {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; imageFilePath=&amp;quot;/&amp;quot;;<br />&amp;nbsp;&amp;nbsp; &amp;nbsp;soundFilePath=&amp;quot;/&amp;quot;;<br />&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;}<br />&amp;nbsp;/**保存文件<br />&amp;nbsp;* @path:路径<br />&amp;nbsp;* @fileData:文件数据<br />&amp;nbsp;* @overrite:是否强制覆盖保存<br />&amp;nbsp;* @return: -1:文件已存在,0:出现异常,1:保存成功<br />&amp;nbsp;*/<br />&amp;nbsp;public int saveFile(String path,byte[] fileData,boolean overrite)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;FileConnection fc=(FileConnection)(Connector.open(path));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(fc.exists())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(overrite)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fc.create();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fc.setWritable(true);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OutputStream os=fc.openOutputStream();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;os.write(fileData);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;os.close();&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return -1;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fc.create();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fc.setWritable(true);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OutputStream os=fc.openOutputStream();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;os.write(fileData);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;os.close();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 1;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;saveFileErr:&amp;quot;+e.toString());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}&amp;nbsp;<br />&amp;nbsp;/*删除文件*/<br />&amp;nbsp;public void deleteFile(String path)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;FileConnection fc=(FileConnection)(Connector.open(path));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(fc.exists())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;fc.delete();<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;deleteFileErr:&amp;quot;+e.toString());<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;<br />&amp;nbsp;/**获取目录文件列表<br />&amp;nbsp;* @path:路径<br />&amp;nbsp;* @type:列表类型(0:文件夹和文件都列;1:只列文件夹;2:只列文件)<br />&amp;nbsp;* @return:指定路径下的目录和文件的名称列表<br />&amp;nbsp;*/<br />&amp;nbsp;public Vector getList(String path,int type)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;Enumeration en=null;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector listVec=new Vector(0,1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(path.equals(&amp;quot;root&amp;quot;))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;en=FileSystemRegistry.listRoots();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileConnection fc=(FileConnection)(Connector.open(path));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(fc.exists())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;en=fc.list();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(en!=null)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(en.hasMoreElements())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String name=(String)(en.nextElement());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch(type)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 0:<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listVec.addElement(name);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 1:<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(name.indexOf(&amp;quot;/&amp;quot;)!=-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listVec.addElement(name);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 2:<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(name.indexOf(&amp;quot;/&amp;quot;)==-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listVec.addElement(name);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return listVec;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;pathErr&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;listErr:&amp;quot;+e.toString());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;message=e.toString();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;/*图片文件列表*/<br />&amp;nbsp;public Vector getImageList()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;Vector list=getList(&amp;quot;<a href="file:///"+imageFilePath,0">file:///&amp;quot;+imageFilePath,0</a>);<br />&amp;nbsp;&amp;nbsp;return list;<br />&amp;nbsp;}<br />&amp;nbsp;/*声音文件列表*/<br />&amp;nbsp;public Vector getSoundList()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;Vector list=getList(&amp;quot;<a href="file:///"+soundFilePath,0">file:///&amp;quot;+soundFilePath,0</a>);<br />&amp;nbsp;&amp;nbsp;return list;<br />&amp;nbsp;}<br />&amp;nbsp;/*读取文件<br />&amp;nbsp;$path:文件路径<br />&amp;nbsp;$showProgress:是否显示读取进度，注意，如果选择显示进度会导致读取文件速度变慢<br />&amp;nbsp; $return:如果成功获取到文件则返回存储文件数据的数组，否则返回null<br />&amp;nbsp; */<br />&amp;nbsp;public byte[] readFile(String path,boolean showProgress)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;FileConnection fc=(FileConnection)(Connector.open(path));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(fc.exists())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message=&amp;quot;文件存在&amp;quot;;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InputStream is=fc.openInputStream();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileSize=is.available();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[] temp=new byte[fileSize];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*如果需要显示进度*/<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(showProgress)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int ch;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i=0;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int step=fileSize/100;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentProgress=0;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while((ch=is.read())!=-1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp[i++]=(byte)ch;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(i%step==0)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentProgress++;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is.read(temp);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is.close();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return temp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;readFileErr:&amp;quot;+path+e.toString());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;message=e.toString();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />&amp;nbsp;/**获取手机中的联系人信息<br />&amp;nbsp;* @return:包含联系人姓名和电话的Vector<br />&amp;nbsp;*/<br />&amp;nbsp;public Vector readPIM()<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector pim=new Vector(0,1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;ContactList cl=(ContactList)(PIM.getInstance().openPIMList(PIM.CONTACT_LIST,PIM.READ_ONLY));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;Enumeration en=cl.items();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector c=new Vector(0,1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;while(en.hasMoreElements())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.addElement((Contact)(en.nextElement()));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(c.size());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=0;i&amp;lt;c.size();i++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Contact temp=(Contact)(c.elementAt(i));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(cl.isSupportedField(Contact.TEL))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String name=&amp;quot;&amp;quot;,phone=&amp;quot;&amp;quot;;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(cl.isSupportedField(Contact.FORMATTED_NAME))<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int m=0;m&amp;lt;temp.countValues(Contact.FORMATTED_NAME);m++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name+=&amp;quot;&amp;amp;&amp;quot;+temp.getString(Contact.FORMATTED_NAME,m);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name+=&amp;quot;&amp;amp;&amp;quot;;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int m=0;m&amp;lt;temp.countValues(Contact.TEL);m++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;phone+=&amp;quot;&amp;amp;&amp;quot;+temp.getString(Contact.TEL,m);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;phone+=&amp;quot;&amp;amp;&amp;quot;;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pim.addElement(new String[]{name,phone});<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//pim.addElement((String)(temp.getString(Contact.FORMATTED_NAME,m)));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//System.out.println(temp.getString(Contact.TEL,m));<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message=&amp;quot;数量:&amp;quot;+c.size()+<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cl.isSupportedField(Contact.NAME)?&amp;quot;Name:&amp;quot;+temp.countValues(Contact.NAME):&amp;quot;&amp;quot;)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+(cl.isSupportedField(Contact.ADDR)?&amp;quot;addr:&amp;quot;+temp.countValues(Contact.ADDR):&amp;quot;&amp;quot;)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+(cl.isSupportedField(Contact.EMAIL)?&amp;quot;Email:&amp;quot;+temp.countValues(Contact.EMAIL):&amp;quot;&amp;quot;)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+(cl.isSupportedField(Contact.FORMATTED_NAME)?&amp;quot;FORMATTED_NAME:&amp;quot;+temp.countValues(Contact.FORMATTED_NAME):&amp;quot;&amp;quot;)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+(cl.isSupportedField(Contact.NICKNAME)?&amp;quot;NICKNAME:&amp;quot;+temp.countValues(Contact.NICKNAME):&amp;quot;&amp;quot;)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+(cl.isSupportedField(Contact.TEL)?&amp;quot;TEL:&amp;quot;+temp.countValues(Contact.TEL):&amp;quot;&amp;quot;)<br />//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+(cl.isSupportedField(Contact.TITLE)?&amp;quot;Title:&amp;quot;+temp.countValues(Contact.TITLE):&amp;quot;&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return pim;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(e);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;message=&amp;quot;读取PIM失败:&amp;quot;+e.toString();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}<br />}<br /></p>]]></description> 
<guid isPermaLink="false">5952611@http://gophinight.bokee.com/</guid> 
<dc:subject>J2ME技术性文章</dc:subject> 
<dc:date>2006-12-13T14:02:38Z</dc:date> 
</item> 
<item> 
<title><![CDATA[MD5算法J2me版本]]></title> 
<link>http://gophinight.bokee.com/5591505.html</link> 
<description><![CDATA[<p>是在猴哥和阿土的帮助下得到的，直接贴代码，原版只有一个入口是字符串入口，在实际使用中，此入口在计算文件的MD5时会有问题，所以我加了一个byte[]入口。</p><p>/*手机博客客户端.MD5码计算<br />开发：李果<br />开发开始日期：２００６年５月８日<br />*/<br />public class MD5 {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 下面这些S11-S44实际上是一个4*4的矩阵，在原始的C实现中是用#define 实现的,这里把它们</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 实现成为static final是表示了只读，切能在同一个进程空间内的多个Instance间共享*/</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S11 = 7;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S12 = 12;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S13 = 17;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S14 = 22;</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S21 = 5;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S22 = 9;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S23 = 14;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S24 = 20;</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S31 = 4;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S32 = 11;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S33 = 16;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S34 = 23;</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S41 = 6;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S42 = 10;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S43 = 15;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final int S44 = 21;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; static final byte[] PADDING = {-128, 0, 0, 0, 0, 0, 0, 0, 0,</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 下面的三个成员是MD5计算过程中用到的3个核心数据，在原始的C实现中 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&amp;nbsp;&amp;nbsp; 被定义到MD5_CTX结构中 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; private long[] state = new long[4];&amp;nbsp; // state (ABCD)</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; private long[] count = new long[2];&amp;nbsp; // number of bits, modulo 2^64 (lsb first)</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; private byte[] buffer = new byte[64]; // input buffer</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* digestHexStr是MD5的唯一一个公共成员，是最新一次计算结果的16进制ASCII表示. */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; public String digestHexStr;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* digest,是最新一次计算结果的2进制内部表示，表示128bit的MD5值. */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; private byte[] digest = new byte[16];</p><p /><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&amp;nbsp; getMD5ofStr是类MD5最主要的公共方法，入口参数是你想要进行MD5变换的字符串 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&amp;nbsp; 返回的是变换完的结果，这个结果是从公共成员digestHexStr取得的．*/</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getMD5ofStr(String inbuf) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Init();</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Update(inbuf.getBytes(), inbuf.length());</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Final();</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; digestHexStr = &amp;quot;&amp;quot;;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 16; i++) {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; digestHexStr += byteHEX(digest[i]);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return digestHexStr;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; <br />&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getMD5ofStr(byte[] inbuf)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Init();</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Update(inbuf, inbuf.length);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Final();</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; digestHexStr = &amp;quot;&amp;quot;;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 16; i++) {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; digestHexStr += byteHEX(digest[i]);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return digestHexStr;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 这是MD5这个类的标准构造函数，JavaBean要求有一个public的并且没有参数的构造函数. */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; public MD5() {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Init();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* md5Init是一个初始化函数，初始化核心变量，装入标准的幻数 */<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private void md5Init() {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count[0] = 0L;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count[1] = 0L;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///* Load magic initialization constants.</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state[0] = 0x67452301L;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state[1] = 0xefcdab89L;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state[2] = 0x98badcfeL;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state[3] = 0x10325476L;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* F, G, H ,I 是4个基本的MD5函数，在原始的MD5的C实现中，由于它们是 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 简单的位运算，可能出于效率的考虑把它们实现成了宏，在java中，*/</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 我把它们实现成了private方法，名字保持了原来C中的。 */<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private long F(long x, long y, long z) {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (x &amp;amp; y) | ((~x) &amp;amp; z);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private long G(long x, long y, long z) {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (x &amp;amp; z) | (y &amp;amp; (~z));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private long H(long x, long y, long z) {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return x ^ y ^ z;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private long I(long x, long y, long z) {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return y ^ (x | (~z));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p /><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* FF,GG,HH和II将调用F,G,H,I进行近一步变换 FF, GG, HH, and II transformations */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation. */<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private long FF(long a, long b, long c, long d, long x, long s, long ac) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a += F(b, c, d) + x + ac;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = ((int) a &amp;lt;&amp;lt; s) | ((int) a &amp;gt;&amp;gt;&amp;gt; (32 - s));</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a += b;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return a;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private long GG(long a, long b, long c, long d, long x, long s, long ac) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a += G(b, c, d) + x + ac;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = ((int) a &amp;lt;&amp;lt; s) | ((int) a &amp;gt;&amp;gt;&amp;gt; (32 - s));</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a += b;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return a;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private long HH(long a, long b, long c, long d, long x, long s, long ac) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a += H(b, c, d) + x + ac;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = ((int) a &amp;lt;&amp;lt; s) | ((int) a &amp;gt;&amp;gt;&amp;gt; (32 - s));</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a += b;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return a;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private long II(long a, long b, long c, long d, long x, long s, long ac) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a += I(b, c, d) + x + ac;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = ((int) a &amp;lt;&amp;lt; s) | ((int) a &amp;gt;&amp;gt;&amp;gt; (32 - s));</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a += b;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return a;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p /><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* md5Update是MD5的主计算过程，inbuf是要变换的字节串，inputlen是长度，这个 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 函数由getMD5ofStr调用，调用之前需要调用md5init，因此把它设计成private */<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private void md5Update(byte[] inbuf, int inputLen) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i, index, partLen;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] block = new byte[64];</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index = (int) (count[0] &amp;gt;&amp;gt;&amp;gt; 3) &amp;amp; 0x3F;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // /* Update number of bits */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((count[0] += (inputLen &amp;lt;&amp;lt; 3)) &amp;lt; (inputLen &amp;lt;&amp;lt; 3))</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count[1]++;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count[1] += (inputLen &amp;gt;&amp;gt;&amp;gt; 29);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; partLen = 64 - index;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Transform as many times as possible.</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (inputLen &amp;gt;= partLen) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Memcpy(buffer, inbuf, index, 0, partLen);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Transform(buffer);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = partLen; i + 63 &amp;lt; inputLen; i += 64) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Memcpy(block, inbuf, 0, i, 64);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Transform(block);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index = 0;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = 0;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///* Buffer remaining input */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Memcpy(buffer, inbuf, index, i, inputLen - i);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; /* md5Final整理和填写输出结果 */<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private void md5Final() {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] bits = new byte[8];</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int index, padLen;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///* Save number of bits */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Encode(bits, count, 8);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///* Pad out to 56 mod 64.</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index = (int) (count[0] &amp;gt;&amp;gt;&amp;gt; 3) &amp;amp; 0x3f;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; padLen = (index &amp;lt; 56) ? (56 - index) : (120 - index);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Update(PADDING, padLen);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///* Append length (before padding) */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Update(bits, 8);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///* Store state in digest */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Encode(digest, state, 16);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; /* md5Memcpy是一个内部使用的byte数组的块拷贝函数，从input的inpos开始把 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* len长度的字节拷贝到output的outpos位置开始. */<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private void md5Memcpy(byte[] output, byte[] input, int outpos, int inpos, int len) {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = 0; i &amp;lt; len; i++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output[outpos + i] = input[inpos + i];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; /* md5Transform是MD5核心变换程序，有md5Update调用，block是分块的原始字节. */<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private void md5Transform(byte block[]) {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; long a = state[0], b = state[1], c = state[2], d = state[3];</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; long[] x = new long[16];</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Decode(x, block, 64);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Round 1 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = FF(a, b, c, d, x[0], S11, 0xd76aa478L); /* 1 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = FF(d, a, b, c, x[1], S12, 0xe8c7b756L); /* 2 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = FF(c, d, a, b, x[2], S13, 0x242070dbL); /* 3 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = FF(b, c, d, a, x[3], S14, 0xc1bdceeeL); /* 4 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = FF(a, b, c, d, x[4], S11, 0xf57c0fafL); /* 5 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = FF(d, a, b, c, x[5], S12, 0x4787c62aL); /* 6 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = FF(c, d, a, b, x[6], S13, 0xa8304613L); /* 7 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = FF(b, c, d, a, x[7], S14, 0xfd469501L); /* 8 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = FF(a, b, c, d, x[8], S11, 0x698098d8L); /* 9 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = FF(d, a, b, c, x[9], S12, 0x8b44f7afL); /* 10 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = FF(c, d, a, b, x[10], S13, 0xffff5bb1L); /* 11 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = FF(b, c, d, a, x[11], S14, 0x895cd7beL); /* 12 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = FF(a, b, c, d, x[12], S11, 0x6b901122L); /* 13 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = FF(d, a, b, c, x[13], S12, 0xfd987193L); /* 14 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = FF(c, d, a, b, x[14], S13, 0xa679438eL); /* 15 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = FF(b, c, d, a, x[15], S14, 0x49b40821L); /* 16 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Round 2 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = GG(a, b, c, d, x[1], S21, 0xf61e2562L); /* 17 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = GG(d, a, b, c, x[6], S22, 0xc040b340L); /* 18 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = GG(c, d, a, b, x[11], S23, 0x265e5a51L); /* 19 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = GG(b, c, d, a, x[0], S24, 0xe9b6c7aaL); /* 20 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = GG(a, b, c, d, x[5], S21, 0xd62f105dL); /* 21 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = GG(d, a, b, c, x[10], S22, 0x2441453L); /* 22 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = GG(c, d, a, b, x[15], S23, 0xd8a1e681L); /* 23 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = GG(b, c, d, a, x[4], S24, 0xe7d3fbc8L); /* 24 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = GG(a, b, c, d, x[9], S21, 0x21e1cde6L); /* 25 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = GG(d, a, b, c, x[14], S22, 0xc33707d6L); /* 26 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = GG(c, d, a, b, x[3], S23, 0xf4d50d87L); /* 27 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = GG(b, c, d, a, x[8], S24, 0x455a14edL); /* 28 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = GG(a, b, c, d, x[13], S21, 0xa9e3e905L); /* 29 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = GG(d, a, b, c, x[2], S22, 0xfcefa3f8L); /* 30 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = GG(c, d, a, b, x[7], S23, 0x676f02d9L); /* 31 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = GG(b, c, d, a, x[12], S24, 0x8d2a4c8aL); /* 32 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Round 3 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = HH(a, b, c, d, x[5], S31, 0xfffa3942L); /* 33 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = HH(d, a, b, c, x[8], S32, 0x8771f681L); /* 34 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = HH(c, d, a, b, x[11], S33, 0x6d9d6122L); /* 35 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = HH(b, c, d, a, x[14], S34, 0xfde5380cL); /* 36 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = HH(a, b, c, d, x[1], S31, 0xa4beea44L); /* 37 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = HH(d, a, b, c, x[4], S32, 0x4bdecfa9L); /* 38 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = HH(c, d, a, b, x[7], S33, 0xf6bb4b60L); /* 39 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = HH(b, c, d, a, x[10], S34, 0xbebfbc70L); /* 40 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = HH(a, b, c, d, x[13], S31, 0x289b7ec6L); /* 41 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = HH(d, a, b, c, x[0], S32, 0xeaa127faL); /* 42 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = HH(c, d, a, b, x[3], S33, 0xd4ef3085L); /* 43 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = HH(b, c, d, a, x[6], S34, 0x4881d05L); /* 44 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = HH(a, b, c, d, x[9], S31, 0xd9d4d039L); /* 45 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = HH(d, a, b, c, x[12], S32, 0xe6db99e5L); /* 46 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = HH(c, d, a, b, x[15], S33, 0x1fa27cf8L); /* 47 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = HH(b, c, d, a, x[2], S34, 0xc4ac5665L); /* 48 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Round 4 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = II(a, b, c, d, x[0], S41, 0xf4292244L); /* 49 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = II(d, a, b, c, x[7], S42, 0x432aff97L); /* 50 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = II(c, d, a, b, x[14], S43, 0xab9423a7L); /* 51 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = II(b, c, d, a, x[5], S44, 0xfc93a039L); /* 52 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = II(a, b, c, d, x[12], S41, 0x655b59c3L); /* 53 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = II(d, a, b, c, x[3], S42, 0x8f0ccc92L); /* 54 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = II(c, d, a, b, x[10], S43, 0xffeff47dL); /* 55 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = II(b, c, d, a, x[1], S44, 0x85845dd1L); /* 56 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = II(a, b, c, d, x[8], S41, 0x6fa87e4fL); /* 57 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = II(d, a, b, c, x[15], S42, 0xfe2ce6e0L); /* 58 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = II(c, d, a, b, x[6], S43, 0xa3014314L); /* 59 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = II(b, c, d, a, x[13], S44, 0x4e0811a1L); /* 60 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = II(a, b, c, d, x[4], S41, 0xf7537e82L); /* 61 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d = II(d, a, b, c, x[11], S42, 0xbd3af235L); /* 62 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = II(c, d, a, b, x[2], S43, 0x2ad7d2bbL); /* 63 */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = II(b, c, d, a, x[9], S44, 0xeb86d391L); /* 64 */</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state[0] += a;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state[1] += b;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state[2] += c;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state[3] += d;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p /><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Encode把long数组按顺序拆成byte数组，因为java的long类型是64bit的，*/</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 只拆低32bit，以适应原始C实现的用途. */<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private void Encode(byte[] output, long[] input, int len) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i, j;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = 0, j = 0; j &amp;lt; len; i++, j += 4) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output[j] = (byte) (input[i] &amp;amp; 0xffL);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output[j + 1] = (byte) ((input[i] &amp;gt;&amp;gt;&amp;gt; 8) &amp;amp; 0xffL);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output[j + 2] = (byte) ((input[i] &amp;gt;&amp;gt;&amp;gt; 16) &amp;amp; 0xffL);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output[j + 3] = (byte) ((input[i] &amp;gt;&amp;gt;&amp;gt; 24) &amp;amp; 0xffL);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p /><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Decode把byte数组按顺序合成成long数组，因为java的long类型是64bit的，*/</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 只合成低32bit，高32bit清零，以适应原始C实现的用途. */<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; private void Decode(long[] output, byte[] input, int len) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i, j;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = 0, j = 0; j &amp;lt; len; i++, j += 4)</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output[i] = b2iu(input[j]) |</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (b2iu(input[j + 1]) &amp;lt;&amp;lt; 8) |</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (b2iu(input[j + 2]) &amp;lt;&amp;lt; 16) |</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (b2iu(input[j + 3]) &amp;lt;&amp;lt; 24);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p /><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* b2iu是一个把byte按照不考虑正负号的原则的＂升位＂程序，因为java没有unsigned运算 */<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; public static long b2iu(byte b) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return b &amp;lt; 0 ? b &amp;amp; 0x7F + 128 : b;</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* byteHEX()，用来把一个byte类型的数转换成十六进制的ASCII表示，*/</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp; /* 因为java中的byte的toString无法实现这一点，我们又没有C语言中的sprintf(outbuf,&amp;quot;%02X&amp;quot;,ib). */<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; public static String byteHEX(byte ib) {</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* if want to output normal letter please user DigitNormal */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char[] DigitNormal = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'a', 'b', 'c', 'd', 'e', 'f'};</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* if want to output capitalization letter please user DigitCap */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* char[] DigitCap = { '0','1','2','3','4','5','6','7','8','9',</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'A','B','C','D','E','F' }; */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char[] ob = new char[2];</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ob[0] = DigitNormal[(ib &amp;gt;&amp;gt;&amp;gt; 4) &amp;amp; 0X0F];</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* ob[0] = DigitCap[(ib &amp;gt;&amp;gt;&amp;gt; 4) &amp;amp; 0X0F]; */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ob[1] = DigitNormal[ib &amp;amp; 0X0F];</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* ob[1] = DigitCap[ib &amp;amp; 0X0F]; */</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String s = new String(ob);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return s;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p><br />&amp;nbsp;&amp;nbsp;&amp;nbsp; public byte[] getMD5(byte[] data1 , byte[] data2) {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Init();</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Update(data1, data1.length);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Update(data2, data2.length);</p><p>//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Update(Request.key , Request.key.length);</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; md5Final();</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return digest;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }</p><p>}</p><p><br /></p>]]></description> 
<guid isPermaLink="false">5591505@http://gophinight.bokee.com/</guid> 
<dc:subject>J2ME技术性文章</dc:subject> 
<dc:date>2006-08-29T13:22:28Z</dc:date> 
</item> 
<item> 
<title><![CDATA[J2me中实现图片缩放]]></title> 
<link>http://gophinight.bokee.com/5422985.html</link> 
<description><![CDATA[<p>不多说了，直接贴代码</p><p>&amp;nbsp;/*图像变换*/<br />&amp;nbsp;public Image scaleImage(Image src,int scales1,int scales2)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;return transImage(src,src.getWidth()*scales1/scales2,src.getHeight()*scales1/scales2);<br />&amp;nbsp;}<br />&amp;nbsp;public Image transImage(Image src, int w, int h)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; int srcW = src.getWidth();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; int srcH = src.getHeight();<br />&amp;nbsp;&amp;nbsp; &amp;nbsp;int dstW=w,dstH=h;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; Image tmp = Image.createImage(dstW, srcH);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; Graphics g = tmp.getGraphics();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; int scale=16;&amp;nbsp;&amp;nbsp;&amp;nbsp; <br />&amp;nbsp;&amp;nbsp;int delta = (srcW &amp;lt;&amp;lt; scale) / dstW;//扫描长度<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; int pos = delta / 2;//扫描位置<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int x = 0; x &amp;lt; dstW; x++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.setClip(x, 0, 1, srcH);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.drawImage(src, x - (pos &amp;gt;&amp;gt; scale), 0, Graphics.LEFT | Graphics.TOP);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos += delta;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; Image dst = Image.createImage( dstW, dstH);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; g = dst.getGraphics();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; delta = (srcH &amp;lt;&amp;lt; scale) / dstH;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; pos = delta / 2;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int y = 0; y &amp;lt; dstH; y++) <br />&amp;nbsp;&amp;nbsp;&amp;nbsp; {<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.setClip(0,y, dstW, 1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g.drawImage(tmp, 0, y - (pos &amp;gt;&amp;gt; scale), Graphics.LEFT | Graphics.TOP);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos += delta;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; }<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; return dst;<br />&amp;nbsp;}&amp;nbsp;</p><p>用法举例:</p><p>1.将一张图片pic转换成176*208的图</p><p>pic=transImage(pic,176,208);</p><p>2.将一张图片pic转换成原来的两倍大</p><p>pic=scaleImage(pic,2,1);</p><p>3.将一张图片pic转换成原来的三分之二</p><p>pic=scaleImage(pic,2,3);</p><p>从上面的例子，大家应该知道怎么用了吧，呵呵</p>]]></description> 
<guid isPermaLink="false">5422985@http://gophinight.bokee.com/</guid> 
<dc:subject>J2ME技术性文章</dc:subject> 
<dc:date>2006-07-21T17:37:19Z</dc:date> 
</item> 
<item> 
<title><![CDATA[Jsr75学习笔记(一)]]></title> 
<link>http://gophinight.bokee.com/5421322.html</link> 
<description><![CDATA[<p>这段时间因为开发上要用到本地文件，因此开始接触Jsr75的包，Jsr75分两个部分，一部分是File，即本地文件系统，一部分是PIM，说白了就是电话本之类的信息，我先学习的是File部分，通过import javax.microedition.io.file.*里的包，可以实现自由访问本机的文件系统，就跟Windos里的资源管理器一样，在这里我介绍几个我写的方法</p><p>一.获取指定路径的目录和文件列表</p><p>&amp;nbsp;/*目录文件列表*/<br />&amp;nbsp;public Vector list(String path)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;FileConnection fc=(FileConnection)(Connector.open(path));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(fc.exists())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector listVec=new Vector(0,1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Enumeration en=fc.list();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(en.hasMoreElements())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listVec.addElement((String)(en.nextElement()));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return listVec;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;listErr:&amp;quot;+e.toString());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}</p><p>方法里的path参数就是要查找的路径，比如<a href="file:///c:/pictures/">file:///c:/pictures/</a>，切记，如果是目录Path，那么后面的/一定不能省，否则会查找不到内容。这个方法返回的是一个包含了指定Path下的所有目录名和文件名的向量。</p><p>二.建立或者保存一个文件到指定路径</p><p>&amp;nbsp;/*保存文件*/<br />&amp;nbsp;public void saveFile(String path,byte[] fileData)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;FileConnection fc=(FileConnection)(Connector.open(path));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;fc.create();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;fc.setWritable(true);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;OutputStream os=fc.openOutputStream();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;os.write(fileData);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;os.close();<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;saveFileErr:&amp;quot;+e.toString());<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}&amp;nbsp;</p><p>fileData是需要保存的文件内容，可以是声音，也可以是图像，或者文字之类</p><p>三.删除指定文件</p><p>&amp;nbsp;/*删除文件*/<br />&amp;nbsp;public void deleteFile(String path)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;FileConnection fc=(FileConnection)(Connector.open(path));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(fc.exists())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;fc.delete();<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;deleteFileErr:&amp;quot;+e.toString());<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}</p><p>这个方法就不用多解释了</p><p>四.读取指定文件</p><p>&amp;nbsp;/*读取文件*/<br />&amp;nbsp;public byte[] readFile(String path)<br />&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;try<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;FileConnection fc=(FileConnection)(Connector.open(path));<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;if(fc.exists())<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InputStream is=fc.openInputStream();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[] temp=new byte[is.available()];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is.read(temp);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is.close();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return temp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;catch(Exception e)<br />&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;readFileErr:&amp;quot;+path+e.toString());<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;<br />&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;}</p><p>此方法也不用多解释了。</p><p>以上是关于文件操作的最基本的一些功能，也是第一期的学习笔记研究到的内容，更多的内容，过几天继续研究继续写吧，呵呵。</p>]]></description> 
<guid isPermaLink="false">5421322@http://gophinight.bokee.com/</guid> 
<dc:subject>J2ME技术性文章</dc:subject> 
<dc:date>2006-07-21T12:24:12Z</dc:date> 
</item> 
<item> 
<title><![CDATA[摩托手机上的音效开发问题]]></title> 
<link>http://gophinight.bokee.com/5412532.html</link> 
<description><![CDATA[有不少朋友问我为什么摩托的手机在音效方面会有问题，典型的表现是声音在模拟器上打开和关闭不会有问题，但在真机上就会出现关闭声音后无法再开启的问题，其原因很大可能是大家在关闭音效的时候只是调用了stop()，却没有调用deallocate()方法，摩托和NOKIA在这一点不同，NOKIA是不能用Deallocate，MOTO却是必须调用，否则下次打开声音会发生问题。 ]]></description> 
<guid isPermaLink="false">5412532@http://gophinight.bokee.com/</guid> 
<dc:subject>J2ME技术性文章</dc:subject> 
<dc:date>2006-07-19T17:17:36Z</dc:date> 
</item> 

</channel> 
</rss> 