<?xml version="1.0" encoding="UTF-8"?>
<rss>
<channel>
<title>Yeman BLOG</title>
<link>http://www.zhangheng.net/BLOG</link>
<Description>Yeman BLOG</Description>
<language>zh-cn</language>
<copyright>Copyright 2003-2004 Loveyuki</copyright>
<webMaster>webmaster@loveyuki.com</webMaster>
<image>
	<title>Yeman BLOG</title> 
	<url>http://www.zhangheng.net/BLOG/images/logos.gif</url> 
	<link>http://www.zhangheng.net/BLOG</link> 
	<description>Yeman BLOG</description> 
</image>
<item><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=539</link><title><![CDATA[VB.NET 二进制文件操作]]></title><author>admin</author><category>程序设计</category><pubDate>2010-2-26 11:43:43</pubDate><guid>http://www.zhangheng.net/BLOG/blogview.asp?logID=539</guid><description><![CDATA[VB.NET有很多值得学习的地方，这里我们主要介绍VB.NET二进制文件。大家都知道所有文件的存储其实质都是二进制的，VB.NET二进制文件往往由两部分组成，一部分是文件头另一部分存放了文件的内容。文件头通常存放与文件格式有关的信息，以BMP等图象文件为例，它们的文件头中存放了是何种图形格式、图象大小、调色板等信息，要显示图象时先读取文件头以获得文件的详细信息，然后再按其格式把图象内容显示出来。用二进制方式可以操作任何的文件，当然至关重要的一点是要清楚了解所操作文件的文件头结构。<br>&nbsp;&nbsp;&nbsp;&nbsp;VB.NET二进制文件操作主要应用的方法和函数有：Open,Close,Get,Put等。<br><br>Open：在For后面的打开模式要用Binary。<br>Close:关闭文件。<br>Get:在指定位置取得文件的内容，如果省略位置则从当前位置读取。<br>Put:在指定位置写入文件，如果省略位置参数就从当前位置写。<br><br>下面结合代码讲解VB.NET二进制文件的操作<br><br>下述程序完成了将两个文件结合成一个文件以及将这个结合后的文件再拆分成原来的两个文件。文件头的结构是自己定义的，非常简单，共8个字节（也就是两个长整型的长度），前4个字节存放第一个文件的长度，后4个字节存放第二个文件的长度。为了更直观地表达文件的结构，现假设有两个文件，第一个文件长度是100字节，第二个文件是200字节，那么合并后得到的文件应该是308字节。按顺序来看，文件的结构是：<br><br>4第一文件的长度<br>4第二文件的长度<br>100第一文件的二进制内容<br>200第二文件的二进制内容<br><br>除了文件头的8字节长度是固定的后面的长度都会因文件的不同而变化的。<br><br>‘实现文件的合并&nbsp;&nbsp;<br>Private&nbsp;Sub&nbsp;MergeFile()&nbsp;&nbsp;<br>Dim&nbsp;strFileName1&nbsp;As&nbsp;String&nbsp;&#39;第一个文件&nbsp;&nbsp;<br>Dim&nbsp;strFileName2&nbsp;As&nbsp;String&nbsp;&#39;第二个文件&nbsp;&nbsp;<br>Dim&nbsp;strOutput&nbsp;As&nbsp;String&nbsp;&#39;合并后的文件&nbsp;&nbsp;<br>Dim&nbsp;aryContent()&nbsp;As&nbsp;Byte&nbsp;&#39;用来读取文件的数组，每次读取前要重定义&nbsp;&nbsp;<br>strFileName1&nbsp;=&nbsp;&quot;c:\a.bmp&quot;&nbsp;<br>strFileName2&nbsp;=&nbsp;&quot;c:\.bmp&quot;&nbsp;<br>strOutput&nbsp;=&nbsp;&quot;c:\out.bmp&quot;&nbsp;<br>&#39;注意下面三个Open语句都是用Binary模式打开的&nbsp;&nbsp;<br>Open&nbsp;strOutput&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#100&nbsp;&nbsp;<br>Open&nbsp;strFileName1&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#1&nbsp;&nbsp;<br>Open&nbsp;strFileName2&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#2&nbsp;&nbsp;<br>Put&nbsp;#100,&nbsp;,&nbsp;LOF(1)&nbsp;&#39;取得第一文件的长度，并把它写入到合并文件的文件头中&nbsp;&nbsp;<br>Put&nbsp;#100,&nbsp;,&nbsp;LOF(2)&nbsp;&#39;取得第二文件的长度，并写入到合并文件的文件头中&nbsp;&nbsp;<br>ReDim&nbsp;aryContent(LOF(1)&nbsp;-&nbsp;1)&nbsp;&#39;重定义数组，为读取文件做准备&nbsp;&nbsp;<br>Get&nbsp;#1,&nbsp;,&nbsp;aryContent()&nbsp;&#39;取得第一文件的内容到数组&nbsp;&nbsp;<br>Put&nbsp;#100,&nbsp;,&nbsp;aryContent()&nbsp;&#39;把第一文件的内容写到合并文件中&nbsp;&nbsp;<br>ReDim&nbsp;aryContent(LOF(2)&nbsp;-&nbsp;1)&nbsp;&nbsp;<br>Get&nbsp;#2,&nbsp;,&nbsp;aryContent()&nbsp;&nbsp;<br>Put&nbsp;#100,&nbsp;,&nbsp;aryContent()&nbsp;&nbsp;<br>&#39;关闭文件&nbsp;&nbsp;<br>Close&nbsp;#1&nbsp;&nbsp;<br>Close&nbsp;#2&nbsp;&nbsp;<br>Close&nbsp;#100&nbsp;&nbsp;<br>End&nbsp;Sub&nbsp;&nbsp;<br>‘实现文件的拆分&nbsp;&nbsp;<br>Private&nbsp;Sub&nbsp;SplitFile()&nbsp;&nbsp;<br>Dim&nbsp;strFileName1&nbsp;As&nbsp;String&nbsp;&nbsp;<br>Dim&nbsp;strFileName2&nbsp;As&nbsp;String&nbsp;&nbsp;<br>Dim&nbsp;strFileSplit&nbsp;As&nbsp;String&nbsp;&nbsp;<br>Dim&nbsp;aryContent()&nbsp;As&nbsp;Byte&nbsp;&nbsp;<br>Dim&nbsp;lngLOF(1)&nbsp;As&nbsp;Long&nbsp;&#39;存放从文件头取得的两个文件的长度&nbsp;&nbsp;<br>strFileName1&nbsp;=&nbsp;&quot;c:\a2.bmp&quot;&nbsp;<br>strFileName2&nbsp;=&nbsp;&quot;c:\2.bmp&quot;&nbsp;<br>strFileSplit&nbsp;=&nbsp;&quot;c:\out.bmp&quot;&nbsp;<br>Open&nbsp;strFileSplit&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#100&nbsp;&nbsp;<br>Get&nbsp;#100,&nbsp;,&nbsp;lngLOF(0)&nbsp;&#39;取得第一文件的长度&nbsp;&nbsp;<br>Get&nbsp;#100,&nbsp;,&nbsp;lngLOF(1)&nbsp;&#39;第二文件的长度&nbsp;&nbsp;<br>Open&nbsp;strFileName1&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#1&nbsp;&nbsp;<br>Open&nbsp;strFileName2&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#2&nbsp;&nbsp;<br>ReDim&nbsp;aryContent(lngLOF(0)-1)&nbsp;&#39;用第一文件的长度重定义数组，为读取第一文件做准备&nbsp;&nbsp;<br>Get&nbsp;#100,&nbsp;9,&nbsp;aryContent()&nbsp;&#39;从第9字节，即文件后面开始读取第一文件的内容&nbsp;&nbsp;<br>Put&nbsp;#1,&nbsp;,&nbsp;aryContent()&nbsp;&#39;把取得的内容写入到拆分文件中&nbsp;&nbsp;<br>ReDim&nbsp;aryContent(lngLOF(1)-1)&nbsp;&nbsp;<br>Get&nbsp;#100,&nbsp;9&nbsp;+&nbsp;lngLOF(0)&nbsp;+&nbsp;1,&nbsp;aryContent()&nbsp;&#39;从第9字节再加上第一文件的长度处开始读取第二文件的内容，这里可以清楚地看到文件头的作用了&nbsp;&nbsp;<br>Put&nbsp;#2,&nbsp;,&nbsp;aryContent&nbsp;&nbsp;<br>Close&nbsp;#1&nbsp;&nbsp;<br>Close&nbsp;#2&nbsp;&nbsp;<br>Close&nbsp;#100&nbsp;&nbsp;<br>MsgBox&nbsp;&quot;拆分完成。&quot;,&nbsp;vbInformation&nbsp;<br><br><br>文本文件由于没有格式所以它的读写都比较简单和直观，而用二进制操作文件时其实质就是对文件头的理解，如果不知道文件头的结构那就无法对文件进行处理了，知道了文件头所包含的信息后，对文件的操作其实就是按规则进行Get、Put罢了。<br>]]></description></item><item><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=537</link><title><![CDATA[刚做了几个字典，分享一下，大家试试。]]></title><author>admin</author><category>其他</category><pubDate>2010-2-22 0:53:51</pubDate><guid>http://www.zhangheng.net/BLOG/blogview.asp?logID=537</guid><description><![CDATA[今天自己做了几个字典，大家试试看，多提意见。<br><br>日期字典（19600101-20101231），顺序经过优化。<br><br><img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_1002/qnft_1960_2010.rar" target="_blank">下载日期字典</a><br><br>弱密码（碰运气吧）<br><img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_1002/if8m_NUM8.rar" target="_blank">下载弱密码字典</a><br><br>两个字名字拼音字典（不足8位加123）<br><img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_1002/olds_NAME2.rar" target="_blank">下载名字拼音字典</a><br><br>还有一个手机号码字典生成器，可以生成各城市的手机号字典，2010年最新数据，由于太大暂时不供下载了，放个图大家看看。<br><img src="attachments/month_1002/63u0_shouji.JPG" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" />]]></description></item><item><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=530</link><title><![CDATA[验证码识别技术（转）]]></title><author>admin</author><category>程序设计</category><pubDate>2009-12-4 13:58:18</pubDate><guid>http://www.zhangheng.net/BLOG/blogview.asp?logID=530</guid><description><![CDATA[一、验证码的基础知识<br><br>　　1.&nbsp;验证码的主要目标是强迫人机交互来抵抗机器主动化攻击的。<br><br>　　2.&nbsp;大部分的验证码设计者并不得要领，不了解图像处理，机器视觉，模式识别，人工智能的基础概念。<br><br>　　3.&nbsp;应用验证码，可以发财，当然要犯法：比如招商银行密码只有6位，验证码形同虚设，计算机很快就能破解一个有钱的账户，很多帐户是可以网上交易的。<br><br>　　4.&nbsp;也有设计的对比好的，比如Yahoo,Google,Microsoft等。而国内Tencent的中文验证码虽然难，但算不上好。<br><br>　　二、人工智能，模式辨认，机器视觉,免费视频聊天室，图像处置的基础知识<br><br>　　1)主要流程：<br><br>　　比如wo们要从一副图片中，识别出验证码;比如wo们要从一副图片中，检测并识别出一张人脸。&nbsp;大概有哪些步骤呢?<br><br>　　1.图像采集：验证码呢,激情聊天室，就直接通过HTTP抓HTML，然后剖析出图片的url，然后下载保留就可以了。&nbsp;如果是人脸检测识别，一般要通过视屏采集装备，采集回来，通过A/D转操作，存为数字图片或者视频频。<br><br>　　2.预处理：检测是准确的图像款式，转换到适合的格局，紧缩，剪切出ROI，去除噪音，灰度化，转换颜色空间这些。<br><br>　　3.检测：车牌检测识别体系要先找到车牌的大概地位，人脸检测体系要找出图片中所有的人脸(包含疑似人脸);验证码识别呢，主要是找出文字所在的主要区域。<br><br>　　4.前处置：人脸检测和识别，会对人脸在辨认前作一些校订，比如面内面外的旋转，扭曲等。wo这里的验证码识别，“一般”要做文字的切割<br><br>　　5.训练：通过各种模式识别，机器学习算法，来挑选和训练适合数量的训练集。不是训练的样本越多越好。过学习，泛化才能差的问题可能在这里呈现。这一步不是必需的，有些识别算法是不须要训练的。<br><br>　　6.识别：输入待识别的处理后的图片，转换成分类器须要的输入格局，然后通过输出的类和置信度，来断定大概可能是哪个字母。识别实质上就是分类。<br><br>　　2)要害概念：<br><br>　　图像处理：一般指针对数字图像的某种数学处理。比如投影，钝化，锐化，细化，边沿检测，二值化，紧缩，各种数据变换等等。<br><br>　　1.二值化：一般图片都是彩色的，依照真切水平，可能很多级别。为了下降计算庞杂度，便利后续的处理，如果在不丧失要害信息的情形下，能将图片处理成黑白两种颜色，那就最好不过了。<br><br>　　2.细化：找出图像的骨架，图像线条可能是很宽的，通细致化将宽度将为1,激情网站，某些处所可能大于1。不同的细化算法，可能有不同的差别，比如是否更靠近线条中间，比如是否坚持联通行等。<br><br>　　3.边缘检测：重要是懂得边缘的概念。边沿实际上是图像中图像像素属性变化激烈的地方。可能通过一个固定的门限值来断定，也可能是自适应的。门限可能是图像全局的，也可能是局部的。不能说那个就必定好，不过大部分时候，自适应的局部的门限可能要好点。被分析的，可能是色彩，也可能是灰度图像的灰度。<br><br>　　机器视觉：利用计算机来模式实现人的视觉。&nbsp;比如物体检测，定位，识别。依照对图像理解的层次的差异，分高阶和低阶的理解。<br><br>　　模式识别：对事物或者现象的某种表现方法(数值，文字，wo们这里重要想说的是数值)，通过一些处理和剖析，来描写，归类，懂得，说明这些事物，现象及其某种抽象。<br><br>　　人工智能：这种概念对比宽，上面这些都属于人工智能这个大的方向。简略点不要过火学院派的懂得就是，把人类的很“智能”的东西给模仿出来协助生物的人来处理问题，特殊是在盘算机里面。<br>三、常见的验证码的破解分析<br><br>　　以<a target="_blank" href="http://libcaca.zoy.org/wiki/PWNtcha">http://libcaca.zoy.org/wiki/PWNtcha</a>这里PWNtcha项目中的材料为例分析，各种验证码的破解。(办法很多，仅仅从wo个人乍看之下感到可行的方式来分析)<br><br>　　1)Authimage<br><br><br>使用的反破解技术：<br><br>　　1.不持续的点组成字符<br><br>　　2.有必定水平的倾斜<br><br>　　设计不好的地方：<br><br>　　1.通过纵横的直方图投影，可以找到字幕区域<br><br>　　2.通过Hough变换，恰当的参数，可以找到近似的横线，可以做倾斜改正<br><br>　　3.字符串的倾斜式面内的，没有太多的破解难度<br><br>　　4.字母宽度一定，大小一定<br><br><br>　　2)Clubic<br><br><br>使用的反破解技能：<br><br>　　1.字符是手写体<br><br>　　设计不好的处所：<br><br>　　1.检测切割阶段没有任何技术含量，属于设计的比较丑的<br><br>　　2.只有数字，而且手写体变化不大<br><br>　　3.表面看起来对识别阶段有难度，细心分析，发明几乎不用任何高档的训练识别算法，就<br><br>　　固定的招某些像素点是否有颜色就够了<br><br>　　3)linuxfr.org<br><br><br>使用的反破解技能：<br><br>　　1.背景色彩块<br><br>　　2.远景的横线或矩形<br><br>　　设计不好的处所：<br><br>　　1.背景色是单一色块，有形状，通过Region-Growth区域增加来很容易把背景给去掉<br><br>　　2.前景色是尺度的线条，颜色单一<br><br>　　3.字母无粘连<br><br>　　4.都是印刷体<br><br>　　4)Ourcolony<br><br><br>使用的反破解技术：<br><br>　　1.设计的太低级，不屑于去评价<br><br>　　设计不好的地方：<br><br>　　1.这种验证码，设计的最丑，但还是能把菜鸟搞定，究竟学盘算机的少，搞这个破解的更少，正所谓隔行如隔山<br><br>　　5)LiveJournal<br><br><br>使用的反破解技能：<br><br>　　1.这个设计略微好点，使用个随机噪音，而且作为远景<br><br>　　2.字母地位粗细都有变化<br><br>　　设计不好的地方：<br><br>　　1.字母没有粘连<br><br>　　2.噪音类型单一<br><br>　　3.通过在X轴的直方图投影，能正确分割字幕<br><br>　　4.然后在Y周作直方图投影,能准肯定位高度<br><br>　　5.识别阶段，都是印刷体，简单地很<br>四、网上的一些高档验证码<br><br>　　1)ICQ<br><br><br>2)IMDb<br><br><br>3)MS&nbsp;MVPS<br><br><br>4)MVN&nbsp;Forum<br><br><br>　　这些类型是被很多人以为比较难得类型，分析一下可以发明，字符检测，定位和分割都不难。&nbsp;唯一影响识别率的是IMDBb和MVPS这两类，字体变形略大。<br><br>　　总体来说，这些类型的破解也不难，很容易做到50%以上的识别率。<br>&nbsp;&nbsp;<br>五、高等验证码的破解分析<br><br>　　时光关系，wo简单介绍如何应用图像处理和模式识别技术，主动识别比较高等的验证码。<br><br>　　(以风头正劲的Google为例)<br><br><br>1)至少从目前的AI的发展水平看，没有简单的做法能主动处理各种不同的验证码，即使才能很强，那么体系自然也十分庞杂强盛。所以，要想在很简略的算法实现比拟高等的验证码破解，必需分析不同验证码算法的特色：<br><br>　　作为一般的图像处理和计算机视觉，会斟酌色彩，纹理，形状等直接的特性，同时也考虑直方图，灰度等统计特性，还斟酌FFT，Wavelet等各种变换后的特征。但最终目的都是Dimension&nbsp;Reduction(降维)然后利于识别，不仅仅是速度的考虑。从图像的角度看，很多系统都斟酌转换为灰度级甚者黑白图片。<br><br>　　Google的图片可以看出，色彩变化是虚晃一枪，不存在任何处理难度。难度是字体变形和字符粘连。<br><br>　　如果能胜利的分割字符，那么后期识别无论是用SVM等分类算法，还是分析笔顺比划走向来硬识别，都相对好做。<br><br>　　2)图像处理和粘连分割<br><br>　　代码中的part1目录重要完成图像预处置和粘连字符分割<br><br>　　001：将图像从jpg等格局转换为位图便于处理<br><br>　　002：采取Fix/Adaptive的Threshold门限算法，将图片Bin-Value二值化。(可用003算法)<br><br>　　003：采取OSTU分水岭算法，将图片Bin-Value二值化。(更通用，大部分时候后果更好)<br><br>　　005：获取ROI感兴致的区域。<br><br>　　006：Edge&nbsp;Trace边缘跟踪。<br><br>　　007：Edge&nbsp;Detection边界检测。<br><br>　　008：Thin细化去骨架。<br><br>　　009：做了一些Tidy收拾。(这个一般要依据特定的Captcha算法调整)<br><br>　　010：做切割,注意图片中红色的交叉点。<br><br>　　011：将边沿检测和骨干交叉点监测的图像合并。(合并进程可以做分析:&nbsp;比如X坐标偏移门限分析，交叉点区域纹理剖析，线条走势分析，等等各种方式，找出更可能的切分点和分别后部件的组合管理。)<br><br><br>注：在这里，wo们可以看到，根本的部件(字母是分割开了，但可以造成统一字母的被切割成多个Component。&nbsp;一种做法是：利用先验知识，做分割;&nbsp;另外一种做法是，和第二部分的识别联合起来。&nbsp;比如依照从左至右，尝试增长component来识别，如果不能识别而且component的总宽度，总面积还比较小，继续增添。&nbsp;当然不消除拒识的可能性。)<br><br>　　3)字符部件组合和识别。<br><br>　　part2的代码展现了切割后的字母组合，和基于svm的字符识别的训练和识别进程。<br><br>　　Detection.cpp中展现了ImageSpam检测进程中的一些字符分割和组合，layout的分析和利用的简单技术。&nbsp;而Google的验证码的识别，完整可以不用到，仅做参考。<br><br>　　SVM及使用：<br><br>　　实质上，SVM是一个分类器，原始的SVM是一个两类分类的分类器。可以通过1:1或者1:n的方法来组合成一个多类分类的分类器。&nbsp;天生通过核函数的使用支撑高维数据的分类。从几何意义上讲，就是找到最能表现类别特性的那些向量(支撑向量SV),然后找到一条线，能最大化分类的Margin。<br><br>　　libSVM是一个不错的实现。<br><br>　　训练间断和识别阶段的数据收拾和归一化是一样的。这里的简略做法是：<br><br>　　首先：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;SVM_MAX&nbsp;+0.999&nbsp;<br>　　#define&nbsp;SVM_MIN&nbsp;+0.001&nbsp;<br><br><br>　　其次：<br><br>　　扫描黑白待识别字幕图片的每个像素，如果为0(黑色，是字母上的像素),那么svm中该地位就SVM_MAX,反之则反。<br><br>　　最后：<br><br>　　训练阶段，在svm的input的前面，为该类打上标志，即是那一个字母。<br><br>　　识别阶段，当然这个类别标志是SVM分类出来。<br><br>　　注意：<br><br>　　如果是SVM菜鸟，最好找一个在SVM外边做了包装的工具，比如样本选择，交叉验证，核函数选择这些，让程序自动选择和分析。<br><br>六、对验证码设计的一些建议<br><br>　　1.在噪音等类型的使用上，努力让字符和用来混杂的远景和背景不容易区分。努力让坏人(噪音)长得和好人(字母)一样。<br><br>　　2.特别好的验证码的设计，要努力施展人类长于而AI算法不善于的。&nbsp;比如粘连字符的分割和手写体(通过印刷体做特殊的变形也可以)。&nbsp;而不要一味的去加一些看起来比拟庞杂的噪音或者其ta的花哨的东西。即使ni做的足够繁杂，但如果人也难识别，显然别人以为ni是没事找抽型的。<br><br>　　3.&nbsp;从专业的机器视觉的角度说，验证码的设计，必定要让破解者在识别阶段，重复在低阶视觉和高阶视觉之间多重复几次能力辨认出来。&nbsp;这样可以大大下降破解难度和破解的正确率。<br><br>　　七、慎重声名<br><br>　　1.这个问题，本身是人工智能，盘算机视觉，模式识别范畴的一个难题。作为破解者来说，是出于劣势位置。要做的很好，是很难得。总体来说，wo走的是比拟学院派的线路，能真正的破解难度对比高的验证码，不同于网上很多不太入流的破解方式。wo能做的只有应用有限的知识，抛砖引玉而已。很多OCR的技术，特殊是离线手写体中文等文字识别的技术，个人了解有限的很，都不敢在这里乱写。]]></description></item><item><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=529</link><title><![CDATA[Ajax手册(转)]]></title><author>admin</author><category>网络网站</category><pubDate>2009-11-27 17:26:46</pubDate><guid>http://www.zhangheng.net/BLOG/blogview.asp?logID=529</guid><description><![CDATA[XMLHttpRequest<br>提供客户端同http服务器通讯的协议<br><br>Dim&nbsp;HttpReq&nbsp;As&nbsp;New&nbsp;MSXML2.XMLHTTP30&nbsp;<br>HttpReq.open&nbsp;&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;False&nbsp;<br>HttpReq.send&nbsp;<br>MsgBox&nbsp;HttpReq.responseText<br><br>备注<br>客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft&amp;reg;&nbsp;XML&nbsp;Document&nbsp;Object&nbsp;Model&nbsp;(DOM)处理回应。<br><br>XMLHttpRequest成员<br>属性<br><br>onreadystatechange&nbsp;指定当readyState属性改变时的事件处理句柄。只写&nbsp;<br>readyState&nbsp;&nbsp;&nbsp;&nbsp;返回当前请求的状态，只读.&nbsp;<br>responseBody&nbsp;&nbsp;&nbsp;&nbsp;将回应信息正文以unsigned&nbsp;byte数组形式返回.只读&nbsp;<br>responseStream&nbsp;以Ado&nbsp;Stream对象的形式返回响应信息。只读&nbsp;<br>responseText&nbsp;将响应信息作为字符串返回.只读&nbsp;<br>responseXML&nbsp;将响应信息格式化为Xml&nbsp;Document对象并返回，只读&nbsp;<br>status&nbsp;返回当前请求的http状态码.只读&nbsp;<br>statusText&nbsp;&nbsp;&nbsp;&nbsp;返回当前请求的响应行状态，只读<br><br><br>*&nbsp;表示此属性是W3C文档对象模型的扩展.<br><br>方法<br><br>abort&nbsp;取消当前请求&nbsp;<br>getAllResponseHeaders&nbsp;获取响应的所有http头&nbsp;<br>getResponseHeader&nbsp;从响应信息中获取指定的http头&nbsp;<br>open&nbsp;创建一个新的http请求，并指定此请求的方法、URL以及验证信息(用户名/密码)&nbsp;<br>send&nbsp;发送请求到http服务器并接收回应&nbsp;<br>setRequestHeader&nbsp;单独指定请求的某个http头<br><br><br>onreadystatechange<br>指定当readyState属性改变时的事件处理句柄<br><br>语法<br>oXMLHttpRequest.onreadystatechange&nbsp;=&nbsp;funcMyHandler;<br><br>如下的例子演示当XMLHTTPRequest对象的readyState属性改变时调用HandleStateChange函数，当数据接收完毕后（readystate&nbsp;==&nbsp;4）此页面上的一个按钮将被激活<br><br>var&nbsp;xmlhttp=null;&nbsp;<br>function&nbsp;PostOrder(xmldoc)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.5.0&quot;);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.Open(&quot;POST&quot;,&nbsp;&quot;<a target="_blank" href="http://myserver/orders/processorder.asp&quot;">http://myserver/orders/processorder.asp&quot;</a>,&nbsp;false);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.onreadystatechange=&nbsp;HandleStateChange;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.Send(xmldoc);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;myButton.disabled&nbsp;=&nbsp;true;&nbsp;<br>}&nbsp;<br>function&nbsp;HandleStateChange()&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(xmlhttp.readyState&nbsp;==&nbsp;4)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myButton.disabled&nbsp;=&nbsp;false;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;Result&nbsp;=&nbsp;&quot;&nbsp;+&nbsp;xmlhttp.responseXML.xml);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br>}<br><br>备注<br>此属性只写，为W3C文档对象模型的扩展.<br><br>readyState<br>返回XMLHTTP请求的当前状态<br><br>语法<br>lValue&nbsp;=&nbsp;oXMLHttpRequest.readyState;<br><br>var&nbsp;XmlHttp;&nbsp;<br>XmlHttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);<br><br>function&nbsp;send()&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlHttp.onreadystatechange&nbsp;=&nbsp;doHttpReadyStateChange;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlHttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/sample.xml&quot;">http://localhost/sample.xml&quot;</a>,&nbsp;true);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlHttp.send();&nbsp;<br>}<br><br>function&nbsp;doHttpReadyStateChange()&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(XmlHttp.readyState&nbsp;==&nbsp;4)&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;Done&quot;);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br>}<br><br>备注<br>变量，此属性只读，状态用长度为4的整型表示.定义如下：<br><br><br>0&nbsp;(未初始化)&nbsp;对象已建立，但是尚未初始化（尚未调用open方法）&nbsp;<br>1&nbsp;(初始化)&nbsp;对象已建立，尚未调用send方法&nbsp;<br>2&nbsp;(发送数据)&nbsp;send方法已调用，但是当前的状态及http头未知&nbsp;<br>3&nbsp;(数据传送中)&nbsp;已接收部分数据，因为响应及http头不全，这时通过responseBody和responseText获取部分数据会出现错误，&nbsp;<br>4&nbsp;(完成)&nbsp;数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据<br><br><br>responseBody<br>返回某一格式的服务器响应数据<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.responseBody;<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.responseBody);<br><br>备注<br>变量，此属性只读，以unsigned&nbsp;array格式表示直接从服务器返回的未经解码的二进制数据。<br><br>responseStream<br>以Ado&nbsp;Stream对象的形式返回响应信息<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.responseStream;<br><br>备注<br>变量，此属性只读，以Ado&nbsp;Stream对象的形式返回响应信息。<br><br>responseText<br>将响应信息作为字符串返回<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.responseText;<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.responseText);<br><br>备注<br>变量，此属性只读，将响应信息作为字符串返回。<br>XMLHTTP尝试将响应信息解码为Unicode字符串，XMLHTTP默认将响应数据的编码定为UTF-8，如果服务器返回的数据带BOM(byte-order&nbsp;mark)，XMLHTTP可以解码任何UCS-2&nbsp;(big&nbsp;or&nbsp;little&nbsp;endian)或者UCS-4&nbsp;数据。注意，如果服务器返回的是xml文档，此属性并不处理xml文档中的编码声明。你需要使用responseXML来处理。<br><br>responseXML<br>将响应信息格式化为Xml&nbsp;Document对象并返回<br><br>语法<br>var&nbsp;objDispatch&nbsp;=&nbsp;oXMLHttpRequest.responseXML;<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.responseXML.xml);<br><br>备注<br>变量，此属性只读，将响应信息格式化为Xml&nbsp;Document对象并返回。如果响应数据不是有效的XML文档，此属性本身不返回XMLDOMParseError，可以通过处理过的DOMDocument对象获取错误信息。<br><br>status<br>返回当前请求的http状态码<br><br>语法<br>lValue&nbsp;=&nbsp;oXMLHttpRequest.status;<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.status);<br><br>返回值<br>长整形标准http状态码，定义如下：<br><br>Number&nbsp;&nbsp;&nbsp;&nbsp;Description&nbsp;&nbsp;<br>100<br>Continue<br><br>101<br>Switching&nbsp;protocols<br><br>200<br>OK<br><br>201<br>Created<br><br>202<br>Accepted<br><br>203<br>Non-Authoritative&nbsp;Information<br><br>204<br>No&nbsp;Content<br><br>205<br>Reset&nbsp;Content<br><br>206<br>Partial&nbsp;Content<br><br>300<br>Multiple&nbsp;Choices<br><br>301<br>Moved&nbsp;Permanently<br><br>302<br>Found<br><br>303<br>See&nbsp;Other<br><br>304<br>Not&nbsp;Modified<br><br>305<br>Use&nbsp;Proxy<br><br>307<br>Temporary&nbsp;Redirect<br><br>400<br>Bad&nbsp;Request<br><br>401<br>Unauthorized<br><br>402<br>Payment&nbsp;Required<br><br>403<br>Forbidden<br><br>404<br>Not&nbsp;Found<br><br>405<br>Method&nbsp;Not&nbsp;Allowed<br><br>406<br>Not&nbsp;Acceptable<br><br>407<br>Proxy&nbsp;Authentication&nbsp;Required<br><br>408<br>Request&nbsp;Timeout<br><br>409<br>Conflict<br><br>410<br>Gone<br><br>411<br>Length&nbsp;Required<br><br>412<br>Precondition&nbsp;Failed<br><br>413<br>Request&nbsp;Entity&nbsp;Too&nbsp;Large<br><br>414<br>Request-URI&nbsp;Too&nbsp;Long<br><br>415<br>Unsupported&nbsp;Media&nbsp;Type<br><br>416<br>Requested&nbsp;Range&nbsp;Not&nbsp;Suitable<br><br>417<br>Expectation&nbsp;Failed<br><br>500<br>Internal&nbsp;Server&nbsp;Error<br><br>501<br>Not&nbsp;Implemented<br><br>502<br>Bad&nbsp;Gateway<br><br>503<br>Service&nbsp;Unavailable<br><br>504<br>Gateway&nbsp;Timeout<br><br>505<br>HTTP&nbsp;Version&nbsp;Not&nbsp;Supported<br><br><br>备注<br>长整形，此属性只读，返回当前请求的http状态码,此属性仅当数据发送并接收完毕后才可获取。<br><br>statusText<br>返回当前请求的响应行状态<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.statusText;<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.statusText);<br><br>备注<br>字符串，此属性只读，以BSTR返回当前请求的响应行状态,此属性仅当数据发送并接收完毕后才可获取。<br><br>abort<br>取消当前请求<br><br>语法<br>oXMLHttpRequest.abort();<br><br>备注<br>调用此方法后，当前请求返回UNINITIALIZED&nbsp;状态。<br><br>getAllResponseHeaders<br>获取响应的所有http头<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.getAllResponseHeaders();<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/sample.xml&quot;">http://localhost/sample.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.getAllResponseHeaders());<br><br>输出由web服务器返回的http头信息:<br><br>Server:Microsoft-IIS/5.1&nbsp;<br>X-Powered-By:ASP.NET&nbsp;<br>Date:Sat,&nbsp;07&nbsp;Jun&nbsp;2003&nbsp;23:23:06&nbsp;GMT&nbsp;<br>Content-Type:text/xml&nbsp;<br>Accept-Ranges:bytes&nbsp;<br>Last&nbsp;Modified:Sat,&nbsp;06&nbsp;Jun&nbsp;2003&nbsp;17:19:04&nbsp;GMT&nbsp;<br>ETag:&quot;a0e2eeba4f2cc31:97f&quot;&nbsp;<br>Content-Length:9<br><br>备注<br>每个http头名称和值用冒号分割，并以\r\n结束。当send方法完成后才可调用该方法。<br><br>getResponseHeader<br>从响应信息中获取指定的http头<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.getResponseHeader(bstrHeader);<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;MSXML2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/sample.xml&quot;">http://localhost/sample.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.getResponseHeader(&quot;Server&quot;));<br><br>输出http头中的server列：当前web服务器的版本及名称。<br><br>备注<br>当send方法成功后才可调用该方法。如果服务器返回的文档类型为&quot;text/xml&quot;,&nbsp;则这句话xmlhttp.getResponseHeader(&quot;Content-Type&quot;);将返回字符串&quot;text/xml&quot;。可以使用getAllResponseHeaders方法获取完整的http头信息。<br><br>open<br>创建一个新的http请求，并指定此请求的方法、URL以及验证信息<br><br>语法<br>oXMLHttpRequest.open(bstrMethod,&nbsp;bstrUrl,&nbsp;varAsync,&nbsp;bstrUser,&nbsp;bstrPassword);<br><br>参数<br>bstrMethod<br>http方法，例如：POST、GET、PUT及PROPFIND。大小写不敏感。<br><br>bstrUrl<br>请求的URL地址，可以为绝对地址也可以为相对地址。<br><br>varAsync[可选]<br>布尔型，指定此请求是否为异步方式，默认为true。如果为真，当状态改变时会调用onreadystatechange属性指定的回调函数。<br><br>bstrUser[可选]<br>如果服务器需要验证，此处指定用户名，如果未指定，当服务器需要验证时，会弹出验证窗口。<br><br>bstrPassword[可选]<br>验证信息中的密码部分，如果用户名为空，则此值将被忽略。<br><br>下面的例子演示从服务器请求book.xml,并显示其中的book字段。<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>var&nbsp;book&nbsp;=&nbsp;xmlhttp.responseXML.selectSingleNode(&quot;//book[@id=&#39;bk101&#39;]&quot;);&nbsp;<br>alert(book.xml);<br><br>备注<br>调用此方法后，可以调用send方法向服务器发送数据。<br><br>send<br>发送请求到http服务器并接收回应<br><br>语法<br>oXMLHttpRequest.send(varBody);<br><br>参数<br>varBody&nbsp;<br>欲通过此请求发送的数据。<br><br>xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://hi.baidu.com/ailiss&quot;">http://hi.baidu.com/ailiss&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.responseXML.xml);<br><br>备注<br>此方法的同步或异步方式取决于open方法中的bAsync参数，如果bAsync&nbsp;==&nbsp;False，此方法将会等待请求完成或者超时时才会返回，如果bAsync&nbsp;==&nbsp;True，此方法将立即返回。<br><br>This&nbsp;method&nbsp;takes&nbsp;one&nbsp;optional&nbsp;parameter,&nbsp;which&nbsp;is&nbsp;the&nbsp;requestBody&nbsp;to&nbsp;use.&nbsp;The&nbsp;acceptable&nbsp;VARIANT&nbsp;input&nbsp;types&nbsp;are&nbsp;BSTR,&nbsp;SAFEARRAY&nbsp;of&nbsp;UI1&nbsp;(unsigned&nbsp;bytes),&nbsp;IDispatch&nbsp;to&nbsp;an&nbsp;XML&nbsp;Document&nbsp;Object&nbsp;Model&nbsp;(DOM)&nbsp;object,&nbsp;and&nbsp;IStream&nbsp;*.&nbsp;You&nbsp;can&nbsp;use&nbsp;only&nbsp;chunked&nbsp;encoding&nbsp;(for&nbsp;sending)&nbsp;when&nbsp;sending&nbsp;IStream&nbsp;*&nbsp;input&nbsp;types.&nbsp;The&nbsp;component&nbsp;automatically&nbsp;sets&nbsp;the&nbsp;Content-Length&nbsp;header&nbsp;for&nbsp;all&nbsp;but&nbsp;IStream&nbsp;*&nbsp;input&nbsp;types.<br><br>如果发送的数据为BSTR，则回应被编码为utf-8,&nbsp;必须在适当位置设置一个包含charset的文档类型头。<br><br>If&nbsp;the&nbsp;input&nbsp;type&nbsp;is&nbsp;a&nbsp;SAFEARRAY&nbsp;of&nbsp;UI1,&nbsp;the&nbsp;response&nbsp;is&nbsp;sent&nbsp;as&nbsp;is&nbsp;without&nbsp;additional&nbsp;encoding.&nbsp;The&nbsp;caller&nbsp;must&nbsp;set&nbsp;a&nbsp;Content-Type&nbsp;header&nbsp;with&nbsp;the&nbsp;appropriate&nbsp;content&nbsp;type.<br><br>如果发送的数据为XML&nbsp;DOM&nbsp;object，则回应将被编码为在xml文档中声明的编码，如果在xml文档中没有声明编码，则使用默认的UTF-8。<br><br>If&nbsp;the&nbsp;input&nbsp;type&nbsp;is&nbsp;an&nbsp;IStream&nbsp;*,&nbsp;the&nbsp;response&nbsp;is&nbsp;sent&nbsp;as&nbsp;is&nbsp;without&nbsp;additional&nbsp;encoding.&nbsp;The&nbsp;caller&nbsp;must&nbsp;set&nbsp;a&nbsp;Content-Type&nbsp;header&nbsp;with&nbsp;the&nbsp;appropriate&nbsp;content&nbsp;type.<br><br>setRequestHeader<br>单独指定请求的某个http头<br><br>语法<br>oXMLHttpRequest.setRequestHeader(bstrHeader,&nbsp;bstrValue);<br><br>参数<br>bstrHeader<br>字符串，头名称。<br><br>bstrValue<br>字符串，值。<br><br><br>备注<br>如果已经存在已此名称命名的http头，则覆盖之。此方法必须在open方法后调用。<br><br><br>xml&nbsp;文件<br><br>&lt;&nbsp;script&nbsp;&gt;<br>x&nbsp;=new&nbsp;ActiveXObject(&quot;Microsoft.XMLHTTP&quot;)<br>x.open(&quot;GET&quot;,&quot;<a target="_blank" href="http://keqiji.org/rss/listings.xml&quot;">http://keqiji.org/rss/listings.xml&quot;</a>,false)<br>x.send()<br>if(x.status==200)<br>{<br>d&nbsp;=&nbsp;x.responseXML<br>c&nbsp;=&nbsp;&quot;&lt;table&gt;&quot;<br>nodes&nbsp;=&nbsp;d.selectNodes(&quot;//RECORDS&quot;)&nbsp;<br>for(i&nbsp;=&nbsp;0;i&lt;nodes[0].childNodes.length;i++)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;subnodes=nodes[0].childNodes[i].childNodes;<br>&nbsp;&nbsp;&nbsp;&nbsp;j=Math.floor(subnodes.length&nbsp;*&nbsp;Math.random())<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;c+=&quot;&lt;tr&gt;&lt;td&nbsp;style=&#39;color:ff0000;font-weight:bold&#39;&gt;&quot;&nbsp;+&nbsp;&nbsp;&nbsp;nodes[0].childNodes[i].nodeName&nbsp;+&nbsp;&quot;：&lt;/td&gt;&lt;/tr&gt;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;c+=&quot;&lt;tr&gt;&lt;td&gt;&lt;a&nbsp;href=&#39;&quot;&nbsp;+&nbsp;subnodes[j].childNodes[0].text&nbsp;+&nbsp;&quot;&#39;&gt;&quot;&nbsp;+&nbsp;subnodes[j].childNodes[1].text&nbsp;+&nbsp;&quot;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;c+=&quot;&lt;tr&gt;&lt;td&gt;&quot;&nbsp;+subnodes[j].childNodes[2].text&nbsp;+&nbsp;&quot;&lt;/td&gt;&lt;/tr&gt;&quot;<br>}<br>c&nbsp;+=&nbsp;&quot;&lt;/table&gt;&quot;<br>document.all.t.innerHTML&nbsp;=&nbsp;c<br>}<br>&lt;/script&gt;<br><br><br>Post<br><br>function&nbsp;XHConn()<br>{<br>&nbsp;&nbsp;&nbsp;var&nbsp;xmlhttp,&nbsp;bComplete&nbsp;=&nbsp;false;<br>&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch&nbsp;(e)&nbsp;{&nbsp;try&nbsp;{&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch&nbsp;(e)&nbsp;{&nbsp;try&nbsp;{&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;XMLHttpRequest();&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch&nbsp;(e)&nbsp;{&nbsp;xmlhttp&nbsp;=&nbsp;false;&nbsp;}}}<br>&nbsp;&nbsp;&nbsp;if&nbsp;(!xmlhttp)&nbsp;return&nbsp;null;<br>&nbsp;&nbsp;&nbsp;this.connect&nbsp;=&nbsp;function(sURL,&nbsp;sMethod,&nbsp;sVars,&nbsp;fnDone)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!xmlhttp)&nbsp;return&nbsp;false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bComplete&nbsp;=&nbsp;false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sMethod&nbsp;=&nbsp;sMethod.toUpperCase();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(sMethod&nbsp;==&nbsp;&quot;GET&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.open(sMethod,&nbsp;sURL+&quot;?&quot;+sVars,&nbsp;true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sVars&nbsp;=&nbsp;&quot;&quot;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.open(sMethod,&nbsp;sURL,&nbsp;true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.setRequestHeader(&quot;Method&quot;,&nbsp;&quot;POST&nbsp;&quot;+sURL+&quot;&nbsp;HTTP/1.1&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.setRequestHeader(&quot;Content-Type&quot;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;application/x-www-form-urlencoded&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.onreadystatechange&nbsp;=&nbsp;function(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(xmlhttp.readyState&nbsp;==&nbsp;4&nbsp;&amp;&amp;&nbsp;!bComplete)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bComplete&nbsp;=&nbsp;true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fnDone(xmlhttp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.send(sVars);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(z)&nbsp;{&nbsp;return&nbsp;false;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;<br>&nbsp;&nbsp;&nbsp;};<br>&nbsp;&nbsp;&nbsp;return&nbsp;this;<br>}<br><br>]]></description></item><item><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=528</link><title><![CDATA[霍夫变换(Hough Transform)(转)]]></title><author>admin</author><category>算法</category><pubDate>2009-11-26 9:42:49</pubDate><guid>http://www.zhangheng.net/BLOG/blogview.asp?logID=528</guid><description><![CDATA[霍夫变换是图像处理中从图像中识别几何形状的基本方法之一，应用很广泛，也有很多改&nbsp;<br>进算法。最基本的霍夫变换是从黑白图像中检测直线(线段)。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;我们先看这样一个问题：设已知一黑白图像上画了一条直线，要求出这条直线所在的位置&nbsp;<br>。我们知道，直线的方程可以用y=k*x+b&nbsp;来表示，其中k和b是参数，分别是斜率和截距。过某一点&nbsp;<br>(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一族直线。方程y0=kx0+b在&nbsp;<br>参数k--b平面上是一条直线，(你也可以是方程b=-x0*k+y0对应的直线)。这样，图像x--y平面上的&nbsp;<br>一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设&nbsp;<br>图像上的直线是y=x,&nbsp;我们先取上面的三个点：A(0,0),&nbsp;B(1,1),&nbsp;C(22)。可以求出，过A点的直线&nbsp;<br>的参数要满足方程b=0,&nbsp;过B点的直线的参数要满足方程1=k+b,&nbsp;过C点的直线的参数要满足方程&nbsp;<br>2=2k+b,&nbsp;这三个方程就对应着参数平面上的三条直线，而这三条直线会相交于一点(k=1,b=0)。　同&nbsp;<br>理，原图像上直线y=x上的其它点(如(3,3),(4,4)等)　对应参数平面上的直线也会通过点(k=1,b=0)&nbsp;<br>。这个性质就为我们解决问题提供了方法：&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;首先，我们初始化一块缓冲区，对应于参数平面，将其所有数据置为0.&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;对于图像上每一前景点，求出参数平面对应的直线，把这直线上的所有点的值都加１。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;最后，找到参数平面上最大点的位置，这个位置就是原图像上直线的参数。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;上面就是霍夫变换的基本思想。就是把图像平面上的点对应到参数平面上的线，最后通过&nbsp;<br>统计特性来解决问题。假如图像平面上有两条直线，那么最终在参数平面上就会看到两个峰值点，&nbsp;<br>依此类推。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;在实际应用中，y=k*x+b形式的直线方程没有办法表示x=c形式的直线(这时候，直线的斜&nbsp;<br>率为无穷大)。所以实际应用中，是采用参数方程p=x*cos(theta)+y*sin(theta)。这样，图像平面&nbsp;<br>上的一个点就对应到参数p---theta平面上的一条曲线上。其它的还是一样。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;在看下面一个问题：我们要从一副图像中检测出半径以知的圆形来。这个问题比前一个还&nbsp;<br>要直观。我们可以取和图像平面一样的参数平面，以图像上每一个前景点为圆心，以已知的半径在&nbsp;<br>参数平面上画圆，并把结果进行累加。最后找出参数平面上的峰值点，这个位置就对应了图像上的&nbsp;<br>圆心。在这个问题里，图像平面上的每一点对应到参数平面上的一个圆。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;把上面的问题改一下，假如我们不知道半径的值，而要找出图像上的圆来。这样，一个办&nbsp;<br>法是把参数平面扩大称为三维空间。就是说，参数空间变为x--y--R三维，对应圆的圆心和半径。&nbsp;<br>图像平面上的每一点就对应于参数空间中每个半径下的一个圆，这实际上是一个圆锥。最后当然还&nbsp;<br>是找参数空间中的峰值点。不过，这个方法显然需要大量的内存，运行速度也会是很大问题。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;有什么更好的方法么?我们前面假定的图像都是黑白图像(2值图像)，实际上这些2值图像&nbsp;<br>多是彩色或灰度图像通过边缘提取来的。我们前面提到过，图像边缘除了位置信息，还有方向信息&nbsp;<br>也很重要，这里就用上了。根据圆的性质，圆的半径一定在垂直于圆的切线的直线上，也就是说，&nbsp;<br>在圆上任意一点的法线上。这样，解决上面的问题，我们仍采用2维的参数空间，对于图像上的每&nbsp;<br>一前景点，加上它的方向信息，都可以确定出一条直线，圆的圆心就在这条直线上。这样一来，问&nbsp;<br>题就会简单了许多。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;接下来还有许多类似的问题，如检测出椭圆，正方形，长方形，圆弧等等。这些方法大都&nbsp;<br>类似，关键就是需要熟悉这些几何形状的数学性质。霍夫变换的应用是很广泛的，比如我们要做一&nbsp;<br>个支票识别的任务，假设支票上肯定有一个红颜色的方形印章，我们可以通过霍夫变换来对这个印&nbsp;<br>章进行快速定位，在配合其它手段进行其它处理。霍夫变换由于不受图像旋转的影响，所以很容易&nbsp;<br>的可以用来进行定位。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;霍夫变换有许多改进方法，一个比较重要的概念是广义霍夫变换，它是针对所有曲线的，&nbsp;<br>用处也很大。就是针对直线的霍夫变换也有很多改进算法，比如前面的方法我们没有考虑图像上的&nbsp;<br>这一直线上的点是否连续的问题，这些都要随着应用的不同而有优化的方法。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;顺便说一句，搞图像处理这一行，在理论方面，有几本杂志是要看的，自然是英文杂志，&nbsp;<br>中文期刊好象没有专门的图像处理期刊，当然也有不少涉及这方面的期刊，但事实求是来说，的确&nbsp;<br>比英文杂志水平差很多。&nbsp;<br>]]></description></item><item><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=526</link><title><![CDATA[验证码识别思路]]></title><author>admin</author><category>程序设计</category><pubDate>2009-11-23 9:49:05</pubDate><guid>http://www.zhangheng.net/BLOG/blogview.asp?logID=526</guid><description><![CDATA[<img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_0911/tqiw_code_shibie.rar" target="_blank">点击下载此文件</a>]]></description></item><item><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=525</link><title><![CDATA[超级积木2]]></title><author>admin</author><category>游戏</category><pubDate>2009-11-6 14:44:14</pubDate><guid>http://www.zhangheng.net/BLOG/blogview.asp?logID=525</guid><description><![CDATA[<br><br><div class="code_head"><input id="VOBJ_7643" type="hidden" value="-1" /><a href="javascript:UBBShowObj('swf','OBJ_7643','attachments/month_0911/wtlz_jimu2.swf','550','400');"><img src="images/icon_media.gif" alt="显示影音文件" align="absmiddle" border="0" /> 点击显示/隐藏影音文件</a></div><div id="OBJ_7643" class="code_main">影音源文件地址：<a href="attachments/month_0911/wtlz_jimu2.swf" target="_blank">attachments/month_0911/wtlz_jimu2.swf</a></div>]]></description></item><item><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=524</link><title><![CDATA[VB中出现该部件的许可证信息没有找到]]></title><author>admin</author><category>故障处理</category><pubDate>2009-11-5 16:56:53</pubDate><guid>http://www.zhangheng.net/BLOG/blogview.asp?logID=524</guid><description><![CDATA[VB&nbsp;中使用控件时出现“该部件的许可证信息没有找到，在设计环境中……”<br><br>Windows&nbsp;Registry&nbsp;Editor&nbsp;Version&nbsp;5.00&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses]&nbsp;<br>@=&quot;Licensing:&nbsp;Copying&nbsp;the&nbsp;keys&nbsp;may&nbsp;be&nbsp;a&nbsp;violation&nbsp;of&nbsp;established&nbsp;copyrights.&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\096EFC40-6ABF-11cf-850C-08002B30345D]&nbsp;<br>@=&quot;knsgigmnmngnmnigthmgpninrmumhgkgrlrk&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\0BF740FC-3012-11D3-A263-00A0CC24A88F]&nbsp;<br>@=&quot;klolslkleegejeeerfgleefetfsflehejesf&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\12B142A4-BD51-11d1-8C08-0000F8754DA1]&nbsp;<br>@=&quot;aadhgafabafajhchnbchehfambfbbachmfmb&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\190B7910-992A-11cf-8AFA-00AA00C00905]&nbsp;<br>@=&quot;gclclcejjcmjdcccoikjlcecoioijjcjnhng&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\1F3D5522-3F42-11d1-B2FA-00A0C908FB55]&nbsp;<br>@=&quot;gcfjdjecpchcncdjpdejijgcrdoijjfcieod&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\2A5D63FD-BF5A-497d-BFE1-F53CEFC37779]&nbsp;<br>@=&quot;AGDHTTTKRNGHAPDFJHSB&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d]&nbsp;<br>@=&quot;mlrljgrlhltlngjlthrligklpkrhllglqlrk&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\38911DA0-E448-11D0-84A3-00DD01104159]&nbsp;<br>@=&quot;mcpckchcdchjcjcclidcgcgchdqdcjhcojpd&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905]&nbsp;<br>@=&quot;kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\43478d75-78e0-11cf-8e78-00a0d100038e]&nbsp;<br>@=&quot;imshohohphlmnhimuinmphmmuiminhlmsmsl&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905]&nbsp;<br>@=&quot;gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\4F86BADF-9F77-11d1-B1B7-0000F8753F5D]&nbsp;<br>@=&quot;iplpwpnippopupiivjrioppisjsjlpiiokuj&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\556C75F1-EFBC-11CF-B9F3-00A0247033C4]&nbsp;<br>@=&quot;xybiedobrqsprbijaegcbislrsiucfjdhisl&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\57CBF9E0-6AA7-11cf-8ADB-00AA00C00905]&nbsp;<br>@=&quot;aahakhchghkhfhaamghhbhbhkbpgfhahlfle&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\6FB38640-6AC7-11cf-8ADB-00AA00C00905]&nbsp;<br>@=&quot;gdjkokgdldikhdddpjkkekgknesjikdkoioh&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\72E67120-5959-11cf-91F6-C2863C385E30]&nbsp;<br>@=&quot;ibcbbbebqbdbciebmcobmbhifcmciibblgmf&nbsp;&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\73A4C9C1-D68D-11d0-98BF-00A0C90DC8D9]&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\73A4C9C1-D68D-11d0-98BF-00A0C90DC8D9\10.0]&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\73A4C9C1-D68D-11d0-98BF-00A0C90DC8D9\10.0\Retail]&nbsp;<br>@=&quot;sbbcdcprktpjtapmmfdacmupasbhscddncgp&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\73A4C9C1-D68D-11d0-98BF-00A0C90DC8D9\11.0]&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\73A4C9C1-D68D-11d0-98BF-00A0C90DC8D9\11.0\Retail]<br><br>@=&quot;sbbcdcprktpjtapmmfdacmupasbhscddncgp&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\74872841-703A-11d1-A3AF-00A0C90F26FA]&nbsp;<br>@=&quot;klglsejeilmereglrfkleeheqkpkelgejgqf&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\78E1BDD1-9941-11cf-9756-00AA00C00908]&nbsp;<br>@=&quot;yjrjvqkjlqqjnqkjvprqsjnjvkuknjpjtoun&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\7C35CA30-D112-11cf-8E72-00A0C90F26F8]&nbsp;<br>@=&quot;whmhmhohmhiorhkouimhihihwiwinhlosmsl&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\80E80EF0-DBBE-11D0-BCE2-00A0C90DCA10]&nbsp;<br>@=&quot;qijimitpmpnpxplpvjnikpkpqoxjmpkpoivj&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\899B3E80-6AC6-11cf-8ADB-00AA00C00905]&nbsp;<br>@=&quot;wjsjjjlqmjpjrjjjvpqqkqmqukypoqjquoun&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\9DF1A470-BA8E-11D0-849C-00A0C90DC8A9]&nbsp;<br>@=&quot;cchcqjejhcgcqcfjpdfcdjkckiqikchcojpd&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\9E799BF1-8817-11cf-958F-0020AFC28C3B]&nbsp;<br>@=&quot;uqpqnqkjujkjjjjqwktjrjkjtkupsjnjtoun&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\A133F000-CCB0-11d0-A316-00AA00688B10]&nbsp;<br>@=&quot;cibbcimbpihbbbbbnhdbeidiocmcbbdbgdoc&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\B08D82D0-3496-44d5-921B-E74D1F013F8C]&nbsp;<br>@=&quot;kvnfkwenasdvnxzvlkjsafnxzvlkcjasfdlwepasd&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\B1692F60-23B0-11D0-8E95-00A0C90F26F8]&nbsp;<br>@=&quot;mjjjccncgjijrcfjpdfjfcejpdkdkcgjojpd&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\B1EFCCF0-6AC1-11cf-8ADB-00AA00C00905]&nbsp;<br>@=&quot;qqkjvqpqmqjjpqjjvpqqkqmqvkypoqjquoun&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\BC96F860-9928-11cf-8AFA-00AA00C00905]&nbsp;<br>@=&quot;mmimfflflmqmlfffrlnmofhfkgrlmmfmqkqj&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\C4145310-469C-11d1-B182-00A0C922E820]&nbsp;<br>@=&quot;konhqhioohihphkouimonhqhvnwiqhhhnjti&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\C4B8C1BC-A36C-4723-AF48-F362BFAB9DF5]&nbsp;<br>@=&quot;eiwzkduejthandlptotuwejwzlodptriweqyahznx&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\CDE57A55-8B86-11D0-b3C6-00A0C90AEA82]&nbsp;<br>@=&quot;ekpkhddkjkekpdjkqemkfkldoeoefkfdjfqe&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\CEDD4F80-B43C-11cf-837C-00AA00573EDE]&nbsp;<br>@=&quot;#%gxwaezucfyqpwjgqbcmtsncuhwsnyhiohwxz&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\D015B071-D2ED-11d0-A31A-00AA00688B10]&nbsp;<br>@=&quot;gjdcfjpcmjicjcdcoihcechjlioiccechepd&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\DC4D7920-6AC8-11cf-8ADB-00AA00C00905]&nbsp;<br>@=&quot;iokouhloohrojhhhtnooiokomiwnmohosmsl&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\E32E2733-1BC5-11d0-B8C3-00A0C90DCA10]&nbsp;<br>@=&quot;kmhfimlflmmfpffmsgfmhmimngtghmoflhsg&quot;&nbsp;<br><br>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Licenses\ED4B87C4-9F76-11d1-8BF7-0000F8754DA1]&nbsp;<br>@=&quot;knlggnmntgggrninthpgmnngrhqhnnjnslsh&quot;&nbsp;<br><br><br>把以上的存为Regcontrols.reg&nbsp;<br>双击就好了<br>]]></description></item><item><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=523</link><title><![CDATA[常用正则表达式]]></title><author>admin</author><category>程序设计</category><pubDate>2009-10-12 16:32:10</pubDate><guid>http://www.zhangheng.net/BLOG/blogview.asp?logID=523</guid><description><![CDATA[匹配中文字符的正则表达式：&nbsp;[\u4e00-\u9fa5]<br>评注：匹配中文还真是个头疼的事，有了这个表达式就好办了<br><br>匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br>评注：可以用来计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）<br><br>匹配空白行的正则表达式：\n\s*\r<br>评注：可以用来删除空白行<br><br>匹配HTML标记的正则表达式：&lt;(\S*?)[^&gt;]*&gt;.*?&lt;/&gt;|&lt;.*?&nbsp;/&gt;<br>评注：网上流传的版本太糟糕，上面这个也仅仅能匹配部分，对于复杂的嵌套标记依旧无能为力<br><br>匹配首尾空白字符的正则表达式：^\s*|\s*$<br>评注：可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)，非常有用的表达式<br><br>匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br>评注：表单验证时很实用<br><br>匹配网址URL的正则表达式：[a-zA-z]+://[^\s]*<br>评注：网上流传的版本功能很有限，上面这个基本可以满足需求<br><br>匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]$<br>评注：表单验证时很实用<br><br>匹配国内电话号码：\d-\d|\d-\d<br>评注：匹配形式如&nbsp;0511-4405222&nbsp;或&nbsp;021-87888822<br><br>匹配腾讯QQ号：[1-9][0-9]<br>评注：腾讯QQ号从10000开始<br><br>匹配中国邮政编码：[1-9]\d(?!\d)<br>评注：中国邮政编码为6位数字<br><br>匹配身份证：\d|\d<br>评注：中国的身份证为15位或18位<br><br>匹配ip地址：\d+\.\d+\.\d+\.\d+<br>评注：提取ip地址时有用<br><br>匹配特定数字：<br>^[1-9]\d*$　&nbsp;　&nbsp;//匹配正整数<br>^-[1-9]\d*$&nbsp;　&nbsp;//匹配负整数<br>^-?[1-9]\d*$　　&nbsp;//匹配整数<br>^[1-9]\d*|0$　&nbsp;//匹配非负整数（正整数&nbsp;+&nbsp;0）<br>^-[1-9]\d*|0$　　&nbsp;//匹配非正整数（负整数&nbsp;+&nbsp;0）<br>^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$　　&nbsp;//匹配正浮点数<br>^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$　&nbsp;//匹配负浮点数<br>^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$　&nbsp;//匹配浮点数<br>^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$　　&nbsp;//匹配非负浮点数（正浮点数&nbsp;+&nbsp;0）<br>^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$　　//匹配非正浮点数（负浮点数&nbsp;+&nbsp;0）<br>评注：处理大量数据时有用，具体应用时注意修正<br><br>匹配特定字符串：<br>^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串<br>^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串<br>^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串<br>^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串<br>^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串<br>评注：最基本也是最常用的一些表达式<br>&nbsp;<br>]]></description></item><item><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=522</link><title><![CDATA[电吉他效果器电路图]]></title><author>admin</author><category>音乐_娱乐</category><pubDate>2009-10-10 9:27:46</pubDate><guid>http://www.zhangheng.net/BLOG/blogview.asp?logID=522</guid><description><![CDATA[今天整理移动硬盘，找到很多以前的东西，这些效果器电路图很多人发邮件找我要过，现在直接发出来大家分享吧。资料是东方宝藏网站的，不知道这个网站还在不在。<br>--------------------------------------------------------------------------------------------------<br><strong>FuzzFace&nbsp;(法兹器)&nbsp;</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;JimiHendrix用的，电路图十分简单，利用晶体三级管在饱和区和截止区的特性来削波。用来弹单音还可以，弹低音弦时，仿佛是听到轰炸机从头顶俯冲过般的声音，弹和弦就不行了，很杂。<br><br><img src="attachments/month_0910/eb4h_JHFFACE.GIF" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><br><strong>RAT&nbsp;(老鼠失真)</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;世界顶级失真效果器！用它产生的失真音色很像电子管吉他音箱的声音。音色光滑细腻，含有大量的二次泛音成分，没有一丝刺耳的感觉,中音饱满温暖，音头更是光滑清脆，犹如珠子般的音色（不知道该用什么来形容）。它带有三个旋钮分别可调失真度、音调、音量。调节它的失真度旋钮，可以让电吉他的音色从过载到失真作平滑的过渡，它的过载音色同样是非常好听，当调节失真度旋钮至约2/5的位置时，再把拾音器开关切换到靠近指板的拾音器时，得到的是一种音头响亮，非常纯净的Blue音色!它也可作为一种过载器来过载其他效果器或音箱!总之RAT是一块音色十分讨人耳朵喜欢的效果器!<br><br><img src="attachments/month_0910/if8l_RAT.JPG" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>&nbsp;&nbsp;&nbsp;&nbsp;1N914可以用1N4148代替，场效应管用3DJ6代替，运放可以用NE5534代替时，得到的将是在高失真度下音色不会随着吉他上的音量旋钮的关小而变暗，高音丰富的失真音色。用LM308N则是原产的RAT音色，这时由于补偿电容30pF的作用，在增大失真度时会出现另外一种由于运放转换速率不够而造成的RAT独特的“转换速率失真”，而且即使在最高失真度下，RAT仍难以置信的保持了极低的躁音。将背对背二极管换成LED，则变成了Turbo&nbsp;RAT,低失真、大输出，当作过载器用，换成锗管失真度更高，音色更软，也可以是一个硅一个锗，这样音色会比较甜一些。<br><br><strong>Ibanez&nbsp;TS-9&nbsp;(电子管尖叫)</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;很著名的过载效果器，略带失真，保留了电吉他所有原来的声音，音头很清巧。用来超载其它失真效果器和电子管音箱可以产生更多的嘎扎声。因为他附加了两个射级器，故过载后的音色很光滑不会产生那种好像被阻塞的音色。&nbsp;<br><img src="attachments/month_0910/pmes_TS9.GIF" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><br><strong>Big&nbsp;Muff</strong>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;我觉得这个效果器得音色不怎么样，音色象Fuzz，但弹高音弦比Fuzz来的更平、偕波没那么重，弹低音弦的声音简直糟透了，非常的混乱，整体音色听起来给人一种好象长了毛刺似的感觉，它的音调旋钮变化起伏很大，调低音时弹高音弦音色还不错，调高音时太单薄了。<br><img src="attachments/month_0910/1xp4_BigMuffPi.gif" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><br><strong>Jorden&nbsp;Bosstone</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;它被设计成三极管Fuzz和二极管削波失真的混合电路，完全继承了FuzzFace得音色，轰炸机般的低音弦失真，粗糙但却非常厚实，不单薄，弹高音接近失真的音色，光滑。可惜的是少了音调控制，不过可以借用一下Big&nbsp;Muff的音调电路，不错。还有就是交流声似乎过大些。&nbsp;<br>电路图<br><img src="attachments/month_0910/pmft_BOSSTONE.GIF" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>PCB<br><img src="attachments/month_0910/nkcr_bosstone_pcb.gif" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>布局<br><img src="attachments/month_0910/fc6j_bosstone_lyt.gif" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><br><strong>Ibanez&nbsp;Sonic&nbsp;Distion-1</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;这个失真效果器我觉得不怎么样，声音有点粗糙，主要是没有足够的失真度，听起来不够爽。<br><img src="attachments/month_0910/86xb_IbanezSonicDistortion.gif" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><br><strong>Dr.Quack&nbsp;</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;自动哇音效果器，中心频率会随着输入信号的大小而移动，所以每弹一个音符就自动哇一下，挺有趣的。它给我的感觉是有时后高音哇地有些太离谱了，成了类似“标标”的声音。&nbsp;<br>电路图&nbsp;<br>Guitar&nbsp;preamplifier&nbsp;and&nbsp;vibrato&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;一个颤音器，震荡电路控制场效应管不断改变发射极电阻Re导致放大倍数起正弦波变化，从而实现颤音。就是Eric&nbsp;Clapton的《My&nbsp;father&#39;s&nbsp;eye》的吉他前奏的那种效果。可以控制颤动频率、颤动幅度、音量，它的颤动幅度不是很大，速度也不是很快，当电池没电时它的颤动幅度会很小。<br><img src="attachments/month_0910/zwo4_QUACK.GIF" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><br><strong>BOSS&nbsp;MT-2金属地带</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;它的名字说明了一切，能产生各种风格的金属失真音色。这是因为它的音调处理电路十分特别，高、中、低三段均衡，再加一个中音频率控制,构成了强大的音调处理阵容。它的失真音色非常的坚硬，音符撕裂般的振动，Metallica的标志音色。最令我感慨的是MT-2的低音十分的强劲，当我把低音开到最大时，只要轻轻碰动琴弦，那“碰、碰”的声音就从音箱中传出，弹闷音时，低音出奇地强悍，雷鸣般的轰融声，以至于我那5W的Daphon烂音箱都受不了而出现破音（我不用的音箱上的小喇叭，而是外接了个家用音响的中置音箱）。调节MT-2的中音钮可以让中音作大幅度的起伏，而且中音频率也是可以改变的，由FnEQ旋钮来控制，这个双联电位器的作用相当于哇音器的踏板。MT-2的风格多变，当把低音开到最大，中音关小，适当调节高音和FnEQ，得到的是音域宽阔的重金音色；如果提升中音，配合适当的高低音、FnEQ，得到的又是十分平滑厚实的失真音色，有出色的延音，适合弹SOLO，其中也包括了Big&nbsp;Muff的音色，但绝对可以比Big&nbsp;Muff更平，更光滑。<br>我按照这个电路图做出来的MT2音色，总觉地失真度不够，比RAT还少，非常没力的感觉。一般得在它前面串上TS9或过载型RAT才行，这样演出时又可以方便的做到金属和过载音色之间的切换。<br><img src="attachments/month_0910/vsky_BossMT2_2.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>&nbsp;&nbsp;&nbsp;&nbsp;场效应管输入缓冲可以用三极管缓冲代替，电路参考TS9,用3DJ6做缓冲的话信号衰减太多，会影响失真度。双运放用NE5532、JRC4558都可以，主观上音色听不出有任何区别。NE5532十分耗电，我测过电流竞高达25mA(五倍RAT的耗电量)！而用JRC4558则减小为15mA，估计采用两片四合一运放(TL074)将十分省电。<br><br><strong>Marshall音箱模拟器</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;如果你没有吉他音箱，或是音箱烂，这玩意儿可少不了！否则，FuzzFace、RAT、MT-2的音色将会是一团糟，你听到的会是，大量刺耳的嗡嗡声！<br>&nbsp;&nbsp;&nbsp;&nbsp;有了它，你在录音时不用话筒对准音箱录，直接接到LINE&nbsp;IN/MIC&nbsp;IN即可录音，演出时也可通过它直接接入调音台。它模拟Marshall音箱的频率响应。用它来接到声卡来录音要比直接接到声卡录声音好的多，少掉了刺耳的高次谐波。将它串在我的破音箱前也消除了原来那刺耳的音色，变得更加悦耳动听。<br>电路图&nbsp;<br><img src="attachments/month_0910/63u9_marshallsim.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>布局<br><img src="attachments/month_0910/b91f_marshallsim_lyt.gif" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><br>还有一些效果器，不知实际音色如何。<br><br>Boss&nbsp;SD-1&nbsp;电路图&nbsp;Boss的过载，电路和TS-9大同小异&nbsp;<br><img src="attachments/month_0910/85wa_BossSD1.gif" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>Boss&nbsp;DS-1&nbsp;电路图&nbsp;失真，Nirvana&nbsp;Kurt&nbsp;Cobain,用的失真，你可以在《Love&nbsp;Buzz》中听到它的音色。<br><img src="attachments/month_0910/urjx_BossDS1.gif" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>Boss&nbsp;DS-2&nbsp;电路图&nbsp;失真，有一个Turbo选择开关，在模式II时，可调出很脏的Grunge失真，也是Kurt&nbsp;Cobain用的。电路图实在太复杂了。<br><img src="attachments/month_0910/jg9m_BossDS2.gif" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" />&nbsp;&nbsp;<br>Boss&nbsp;HM-2&nbsp;电路图&nbsp;重金属&nbsp;<br><img src="attachments/month_0910/63u9_BossHM2.gif" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>]]></description></item>
</channel>
</rss>