<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CQ-CSER &#187; WEB</title>
	<atom:link href="http://cq-cser.cn/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://cq-cser.cn</link>
	<description>计算机爱好者</description>
	<lastBuildDate>Wed, 02 May 2012 10:01:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>xampp-mysql-1067</title>
		<link>http://cq-cser.cn/2011/01/xampp-mysql-1067/</link>
		<comments>http://cq-cser.cn/2011/01/xampp-mysql-1067/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 05:27:04 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[WEB]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1424</guid>
		<description><![CDATA[XAMPP里MYSQL以服务方式启动失败，提示错误是 1067 进程意外终止。 google了一下，发现遇到这个问题还挺多的，主要是xampp处理文件路径上的一个小bug。 解决方法： 1、 进入 xampp安装目录 2、进入mysql\bin\目录， 打开my.ini ， 修改 [mysqld] port= 3306 socket= “/xampp/mysql/mysql.sock” basedir=”/xampp/mysql” tmpdir=”/xampp/tmp” datadir=”/xampp/mysql/data” 把路径补全，比如xampp安装在d盘根目录，那么修改为 [mysqld] port= 3306 socket= “d:/xampp/mysql/mysql.sock” basedir=”d:/xampp/mysql” tmpdir=”d:/xampp/tmp” datadir=”d:/xampp/mysql/data” 3、 重启mysql，搞定 Related posts:xampp MYSQL+.NET VPS 快速安装 Linux+Nginx+MySQL+PHP 环境【转】


Related posts:<ol><li><a href='http://cq-cser.cn/2010/02/xampp/' rel='bookmark' title='Permanent Link: xampp'>xampp</a></li>
<li><a href='http://cq-cser.cn/2010/03/mysql-net/' rel='bookmark' title='Permanent Link: MYSQL+.NET'>MYSQL+.NET</a></li>
<li><a href='http://cq-cser.cn/2009/11/vps-%e5%bf%ab%e9%80%9f%e5%ae%89%e8%a3%85-linuxnginxmysqlphp-%e7%8e%af%e5%a2%83%e3%80%90%e8%bd%ac%e3%80%91/' rel='bookmark' title='Permanent Link: VPS 快速安装 Linux+Nginx+MySQL+PHP 环境【转】'>VPS 快速安装 Linux+Nginx+MySQL+PHP 环境【转】</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>XAMPP里MYSQL以服务方式启动失败，提示错误是 1067 进程意外终止。<br />
<span id="more-1424"></span>google了一下，发现遇到这个问题还挺多的，主要是xampp处理文件路径上的一个小bug。</p>
<p>解决方法：</p>
<p>1、 进入 xampp安装目录</p>
<p>2、进入mysql\bin\目录， 打开my.ini ， 修改</p>
<p>[mysqld]<br />
port= 3306<br />
socket= “/xampp/mysql/mysql.sock”<br />
basedir=”/xampp/mysql”<br />
tmpdir=”/xampp/tmp”<br />
datadir=”/xampp/mysql/data”</p>
<p>把路径补全，比如xampp安装在d盘根目录，那么修改为</p>
<p>[mysqld]<br />
port= 3306<br />
socket= “d:/xampp/mysql/mysql.sock”<br />
basedir=”d:/xampp/mysql”<br />
tmpdir=”d:/xampp/tmp”<br />
datadir=”d:/xampp/mysql/data”</p>
<p>3、 重启mysql，搞定</p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/02/xampp/' rel='bookmark' title='Permanent Link: xampp'>xampp</a></li>
<li><a href='http://cq-cser.cn/2010/03/mysql-net/' rel='bookmark' title='Permanent Link: MYSQL+.NET'>MYSQL+.NET</a></li>
<li><a href='http://cq-cser.cn/2009/11/vps-%e5%bf%ab%e9%80%9f%e5%ae%89%e8%a3%85-linuxnginxmysqlphp-%e7%8e%af%e5%a2%83%e3%80%90%e8%bd%ac%e3%80%91/' rel='bookmark' title='Permanent Link: VPS 快速安装 Linux+Nginx+MySQL+PHP 环境【转】'>VPS 快速安装 Linux+Nginx+MySQL+PHP 环境【转】</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2011/01/xampp-mysql-1067/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>豆瓣电台下载</title>
		<link>http://cq-cser.cn/2011/01/%e8%b1%86%e7%93%a3%e7%94%b5%e5%8f%b0%e4%b8%8b%e8%bd%bd/</link>
		<comments>http://cq-cser.cn/2011/01/%e8%b1%86%e7%93%a3%e7%94%b5%e5%8f%b0%e4%b8%8b%e8%bd%bd/#comments</comments>
		<pubDate>Sun, 02 Jan 2011 03:23:01 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[豆瓣电台]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1407</guid>
		<description><![CDATA[下载链接类似 http://douban.fm/j/mine/playlist?r=0.8999408618547022&#38;type=r&#38;sid=501054&#38;h=&#124;364993:p&#124;630475:p&#124;1380740:p&#124;501054:r&#38;channel=2 SID,CHANNEL,type都是必须的。返回个PLAYLIST。JSON数组? {&#8220;r&#8221;:0,&#8221;song&#8221;:[{"picture":"http:\/\/img3.douban.com\/mpic\/s1400647.jpg","albumtitle":"Lennon Legend: The V...","company":"Capitol","rating_avg":4.609370,"public_time":"1998-02-24","album":"\/subject\/1395275\/","like":"0","artist":"John Lennon","url":"http:\/\/mr4.douban.com\/201101021105\/0222ce7c85ff473e0d91d8d56305e79d\/view\/song\/small\/p1403051.mp3","title":"Cold Turkey","subtype":"","sid":"1403051","aid":"1395275"},{"picture":"http:\/\/img3.douban.com\/mpic\/s3868617.jpg","albumtitle":"Dangerous","company":"Sony","rating_avg":4.696230,"public_time":"1991","album":"\/subject\/1422152\/","like":"0","artist":"Michael Jackson","url":"http:\/\/mr4.douban.com\/201101021105\/20236647acd3ff11c48b284b6817072e\/view\/song\/small\/p967061.mp3","title":"Dangerous","subtype":"","sid":"967061","aid":"1422152"},{"picture":"http:\/\/img3.douban.com\/mpic\/s2717072.jpg","albumtitle":"Westlife - Unbreakab...","company":"RCA Victor Europe","rating_avg":4.496790,"public_time":"2002-11-26","album":"\/subject\/1452987\/","like":"0","artist":"Westlife","url":"http:\/\/mr4.douban.com\/201101021105\/c105dc2839686ef307a4e175bb2170f1\/view\/song\/small\/p1382426.mp3","title":"Unbreakable (single Remix)","subtype":"","sid":"1382426","aid":"1452987"},{"picture":"http:\/\/img3.douban.com\/mpic\/s3017846.jpg","albumtitle":"It Won't Be Soon Bef...","company":"A&#38;M \/ Octone Records","rating_avg":4.088900,"public_time":"2007-05-22","album":"\/subject\/2032823\/","like":"0","artist":"Maroon 5","url":"http:\/\/mr4.douban.com\/201101021105\/c8a3fa06b4c3a5f7236a7f92d74c2243\/view\/song\/small\/p464284.mp3","title":"Won’t Go Home Without You (acoustic Version)","subtype":"","sid":"464284","aid":"2032823"},{"picture":"http:\/\/img3.douban.com\/mpic\/s1400216.jpg","albumtitle":"The Memory Of Trees","company":"© 1995 Warner Music UK Ltd. \/ Reprise Records","rating_avg":4.402740,"public_time":"1995","album":"\/subject\/1394952\/","like":"0","artist":"Enya","url":"http:\/\/mr4.douban.com\/201101021105\/19678cf350c8b131f5e871ad583cd9e7\/view\/song\/small\/p658204.mp3","title":"From Where I Am","subtype":"","sid":"658204","aid":"1394952"},{"picture":"http:\/\/img3.douban.com\/mpic\/s3142014.jpg","albumtitle":"Dreaming Out Loud","company":"Interscope Records","rating_avg":4.162190,"public_time":"2007-11-20","album":"\/subject\/2285684\/","like":"0","artist":"OneRepublic","url":"http:\/\/mr4.douban.com\/201101021105\/dc07f33a38af5d185e66d38af7b5689c\/view\/song\/small\/p1381621.mp3","title":"Stop And Stare","subtype":"","sid":"1381621","aid":"2285684"},{"picture":"http:\/\/img5.douban.com\/mpic\/s3771905.jpg","albumtitle":"Com Lag (2Plus2IsFiv...","company":"EMI Int'l","rating_avg":4.190890,"public_time":"2004","album":"\/subject\/1401429\/","like":"0","artist":"Radiohead","url":"http:\/\/mr3.douban.com\/201101021105\/04367996e2be40270af518cb4d8ec24e\/view\/song\/small\/p1437167.mp3","title":"I Will [Los Angeles [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2010/03/%e6%8e%a8%e8%8d%901-%e7%9e%ac%e9%97%b4%e4%b9%8b%e7%be%8e/' rel='bookmark' title='Permanent Link: 推荐1-瞬间之美'>推荐1-瞬间之美</a></li>
<li><a href='http://cq-cser.cn/2010/03/rot13/' rel='bookmark' title='Permanent Link: ROT13'>ROT13</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>下载链接类似</p>
<p><a href="http://douban.fm/j/mine/playlist?r=0.8999408618547022&amp;type=r&amp;sid=501054&amp;h=|364993:p|630475:p|1380740:p|501054:r&amp;channel=2">http://douban.fm/j/mine/playlist?r=0.8999408618547022&amp;type=r&amp;sid=501054&amp;h=|364993:p|630475:p|1380740:p|501054:r&amp;channel=2</a></p>
<p>SID,CHANNEL,type都是必须的。返回个PLAYLIST。JSON数组?</p>
<p>{&#8220;r&#8221;:0,&#8221;song&#8221;:[{"picture":"http:\/\/img3.douban.com\/mpic\/s1400647.jpg","albumtitle":"Lennon Legend: The V...","company":"Capitol","rating_avg":4.609370,"public_time":"1998-02-24","album":"\/subject\/1395275\/","like":"0","artist":"John Lennon","url":"http:\/\/mr4.douban.com\/201101021105\/0222ce7c85ff473e0d91d8d56305e79d\/view\/song\/small\/p1403051.mp3","title":"Cold Turkey","subtype":"","sid":"1403051","aid":"1395275"},{"picture":"http:\/\/img3.douban.com\/mpic\/s3868617.jpg","albumtitle":"Dangerous","company":"Sony","rating_avg":4.696230,"public_time":"1991","album":"\/subject\/1422152\/","like":"0","artist":"Michael Jackson","url":"http:\/\/mr4.douban.com\/201101021105\/20236647acd3ff11c48b284b6817072e\/view\/song\/small\/p967061.mp3","title":"Dangerous","subtype":"","sid":"967061","aid":"1422152"},{"picture":"http:\/\/img3.douban.com\/mpic\/s2717072.jpg","albumtitle":"Westlife - Unbreakab...","company":"RCA Victor Europe","rating_avg":4.496790,"public_time":"2002-11-26","album":"\/subject\/1452987\/","like":"0","artist":"Westlife","url":"http:\/\/mr4.douban.com\/201101021105\/c105dc2839686ef307a4e175bb2170f1\/view\/song\/small\/p1382426.mp3","title":"Unbreakable (single Remix)","subtype":"","sid":"1382426","aid":"1452987"},{"picture":"http:\/\/img3.douban.com\/mpic\/s3017846.jpg","albumtitle":"It Won't Be Soon Bef...","company":"A&amp;M \/ Octone Records","rating_avg":4.088900,"public_time":"2007-05-22","album":"\/subject\/2032823\/","like":"0","artist":"Maroon 5","url":"http:\/\/mr4.douban.com\/201101021105\/c8a3fa06b4c3a5f7236a7f92d74c2243\/view\/song\/small\/p464284.mp3","title":"Won’t Go Home Without You (acoustic Version)","subtype":"","sid":"464284","aid":"2032823"},{"picture":"http:\/\/img3.douban.com\/mpic\/s1400216.jpg","albumtitle":"The Memory Of Trees","company":"© 1995 Warner Music UK Ltd. \/ Reprise Records","rating_avg":4.402740,"public_time":"1995","album":"\/subject\/1394952\/","like":"0","artist":"Enya","url":"http:\/\/mr4.douban.com\/201101021105\/19678cf350c8b131f5e871ad583cd9e7\/view\/song\/small\/p658204.mp3","title":"From Where I Am","subtype":"","sid":"658204","aid":"1394952"},{"picture":"http:\/\/img3.douban.com\/mpic\/s3142014.jpg","albumtitle":"Dreaming Out Loud","company":"Interscope Records","rating_avg":4.162190,"public_time":"2007-11-20","album":"\/subject\/2285684\/","like":"0","artist":"OneRepublic","url":"http:\/\/mr4.douban.com\/201101021105\/dc07f33a38af5d185e66d38af7b5689c\/view\/song\/small\/p1381621.mp3","title":"Stop And Stare","subtype":"","sid":"1381621","aid":"2285684"},{"picture":"http:\/\/img5.douban.com\/mpic\/s3771905.jpg","albumtitle":"Com Lag (2Plus2IsFiv...","company":"EMI Int'l","rating_avg":4.190890,"public_time":"2004","album":"\/subject\/1401429\/","like":"0","artist":"Radiohead","url":"http:\/\/mr3.douban.com\/201101021105\/04367996e2be40270af518cb4d8ec24e\/view\/song\/small\/p1437167.mp3","title":"I Will [Los Angeles Version]&#8220;,&#8221;subtype&#8221;:&#8221;",&#8221;sid&#8221;:&#8221;1437167&#8243;,&#8221;aid&#8221;:&#8221;1401429&#8243;},{&#8220;picture&#8221;:&#8221;http:\/\/img3.douban.com\/mpic\/s3319502.jpg&#8221;,&#8221;albumtitle&#8221;:&#8221;Playing My Game&#8221;,&#8221;company&#8221;:&#8221;Emi&#8221;,&#8221;rating_avg&#8221;:4.443200,&#8221;public_time&#8221;:&#8221;2000&#8243;,&#8221;album&#8221;:&#8221;\/subject\/1416411\/&#8221;,&#8221;like&#8221;:&#8221;0&#8243;,&#8221;artist&#8221;:&#8221;Lene Marlin&#8221;,&#8221;url&#8221;:&#8221;http:\/\/mr4.douban.com\/201101021105\/50e6a293efe3c02f1c3a59a68d08430c\/view\/song\/small\/p1036351.mp3&#8243;,&#8221;title&#8221;:&#8221;One Year Ago&#8221;,&#8221;subtype&#8221;:&#8221;",&#8221;sid&#8221;:&#8221;1036351&#8243;,&#8221;aid&#8221;:&#8221;1416411&#8243;}]}</p>
<p>可以很明显的看到评分，命名，歌手，歌名等信息，就是不知道那个/SONG/SMALL，是否有对于的/SONG/BIG</p>
<p>下面这位同学已经写好了啦。可以反编译下。可惜自动保存歌曲那个插件坏链了，无法下载。</p>
<p>不依靠各类SDK的一时无法下手啊，对SDK依赖不小啊，可以顺便学习下BHO，蛮好玩的</p>
<p><a href="http://slippor.blogbus.com/logs/62644175.html?s=info&amp;v=4.4.1227.2&amp;t=W7">http://slippor.blogbus.com/logs/62644175.html?s=info&amp;v=4.4.1227.2&amp;t=W7</a></p>
<p>最近没什么兴趣点，神马程序都是浮云，各类服务才是王道</p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/03/%e6%8e%a8%e8%8d%901-%e7%9e%ac%e9%97%b4%e4%b9%8b%e7%be%8e/' rel='bookmark' title='Permanent Link: 推荐1-瞬间之美'>推荐1-瞬间之美</a></li>
<li><a href='http://cq-cser.cn/2010/03/rot13/' rel='bookmark' title='Permanent Link: ROT13'>ROT13</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2011/01/%e8%b1%86%e7%93%a3%e7%94%b5%e5%8f%b0%e4%b8%8b%e8%bd%bd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>micolog-免费GAE博客</title>
		<link>http://cq-cser.cn/2010/07/micolog-%e5%85%8d%e8%b4%b9gae%e5%8d%9a%e5%ae%a2/</link>
		<comments>http://cq-cser.cn/2010/07/micolog-%e5%85%8d%e8%b4%b9gae%e5%8d%9a%e5%ae%a2/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 06:51:29 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[WEB]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1309</guid>
		<description><![CDATA[官网http://micolog.xuming.net/zh-cn 代码：http://code.google.com/p/micolog/source/checkout 简单实用，其主页那篇高性能WEB文章也很强大 于是我也凑热闹搞了个，http://xiaofing.appspot.com/ 不过看很多XX站点也在使用MICOLOG，在GG的羽翼下，前景一般。猜测会有名单制度相对应 Related posts:CSS隐藏文字的方法


Related posts:<ol><li><a href='http://cq-cser.cn/2009/11/css%e9%9a%90%e8%97%8f%e6%96%87%e5%ad%97%e7%9a%84%e6%96%b9%e6%b3%95/' rel='bookmark' title='Permanent Link: CSS隐藏文字的方法'>CSS隐藏文字的方法</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>官网<a href="http://micolog.xuming.net/zh-cn">http://micolog.xuming.net/zh-cn</a></p>
<p>代码：<a href="http://code.google.com/p/micolog/source/checkout">http://code.google.com/p/micolog/source/checkout</a></p>
<p>简单实用，其主页那篇高性能WEB文章也很强大</p>
<p>于是我也凑热闹搞了个，<a href="http://xiaofing.appspot.com/">http://xiaofing.appspot.com/</a></p>
<p>不过看很多XX站点也在使用MICOLOG，在GG的羽翼下，前景一般。猜测会有名单制度相对应</p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2009/11/css%e9%9a%90%e8%97%8f%e6%96%87%e5%ad%97%e7%9a%84%e6%96%b9%e6%b3%95/' rel='bookmark' title='Permanent Link: CSS隐藏文字的方法'>CSS隐藏文字的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/07/micolog-%e5%85%8d%e8%b4%b9gae%e5%8d%9a%e5%ae%a2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>开源网络爬虫介绍及其比较</title>
		<link>http://cq-cser.cn/2010/06/%e5%bc%80%e6%ba%90%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab%e4%bb%8b%e7%bb%8d%e5%8f%8a%e5%85%b6%e6%af%94%e8%be%83/</link>
		<comments>http://cq-cser.cn/2010/06/%e5%bc%80%e6%ba%90%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab%e4%bb%8b%e7%bb%8d%e5%8f%8a%e5%85%b6%e6%af%94%e8%be%83/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 04:01:22 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[网络爬虫]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1216</guid>
		<description><![CDATA[开源网络爬虫介绍及其比较 Planet &#8211; Chinahttp://secinn.appspot.com/planet/feed?site=cn  Nutch 开发语言：Java http://lucene.apache.org/nutch/ 简介： Apache的子项目之一，属于Lucene项目下的子项目。 Nutch是一个基于Lucene，类似Google的完整网络搜索引擎解决方案，基于Hadoop的分布式处理模型保证了系统的性能，类似Eclipse的插件机制保证了系统的可客户化，而且很容易集成到自己的应用之中。 Larbin 开发语言：C++ http://larbin.sourceforge.net/index-eng.html 简介 　　larbin是一种开源的网络爬虫/网络蜘蛛，由法国的年轻人 Sébastien Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取，最后为搜索引擎提供广泛的数据来源。 　　Larbin只是一个爬虫，也就是说larbin只抓取网页，至于如何parse的事情则由用户自己完成。另外，如何存储到数据库以及建立索引的事情 larbin也不提供。 　　latbin最初的设计也是依据设计简单但是高度可配置性的原则，因此我们可以看到，一个简单的larbin的爬虫可以每天获取５００万的网页，非常高效。 Heritrix 开发语言：Java http://crawler.archive.org/ 简介 与Nutch比较 和 Nutch。二者均为Java开源框架，Heritrix 是 SourceForge上的开源产品，Nutch为Apache的一个子项目，它们都称作网络爬虫/蜘蛛（ Web Crawler），它们实现的原理基本一致：深度遍历网站的资源，将这些资源抓取到本地，使用的方法都是分析网站每一个有效的URI，并提交Http请求，从而获得相应结果，生成本地文件及相应的日志信息等。 Heritrix 是个 &#8220;archival crawler&#8221; &#8212; 用来获取完整的、精确的、站点内容的深度复制。包括获取图像以及其他非文本内容。抓取并存储相关的内容。对内容来者不拒，不对页面进行内容上的修改。重新爬行对相同的URL不针对先前的进行替换。爬虫通过Web用户界面启动、监控、调整，允许弹性的定义要获取的URL。 二者的差异： Nutch 只获取并保存可索引的内容。Heritrix则是照单全收。力求保存页面原貌 Nutch 可以修剪内容，或者对内容格式进行转换。 Nutch 保存内容为数据库优化格式便于以后索引；刷新替换旧的内容。而Heritrix 是添加(追加)新的内容。 Nutch 从命令行运行、控制。Heritrix 有 Web 控制管理界面。 Nutch 的定制能力不够强，不过现在已经有了一定改进。Heritrix 可控制的参数更多。 Heritrix提供的功能没有nutch多，有点整站下载的味道。既没有索引又没有解析，甚至对于重复爬取URL都处理不是很好。 Heritrix的功能强大 [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2009/12/20%e5%bc%80%e6%ba%90%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e7%b3%bb%e7%bb%9f/' rel='bookmark' title='Permanent Link: 20开源搜索引擎系统'>20开源搜索引擎系统</a></li>
<li><a href='http://cq-cser.cn/2009/12/seo%e6%89%93%e6%89%8b/' rel='bookmark' title='Permanent Link: SEO打手'>SEO打手</a></li>
<li><a href='http://cq-cser.cn/2010/01/9%e4%b8%aaphp%e5%ba%93%e7%ae%80%e4%bb%8b%e5%92%8c%e4%b8%8b%e8%bd%bd/' rel='bookmark' title='Permanent Link: 9个PHP库简介和下载'>9个PHP库简介和下载</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>开源网络爬虫介绍及其比较</p>
<p>Planet &#8211; China<a href="http://secinn.appspot.com/planet/feed?site=cn" target="_blank">http://secinn.appspot.com/planet/feed?site=cn</a><span id="more-1216"></span> </p>
<div>
<div>
<h3>Nutch</h3>
<p>开发语言：Java</p>
<p>http://lucene.apache.org/nutch/</p>
<p>简介：</p>
<p>Apache的子项目之一，属于Lucene项目下的子项目。</p>
<p>Nutch是一个基于Lucene，类似Google的完整网络搜索引擎解决方案，基于Hadoop的分布式处理模型保证了系统的性能，类似Eclipse的插件机制保证了系统的可客户化，而且很容易集成到自己的应用之中。</p>
<h3>Larbin</h3>
<p>开发语言：<a name="baidusnap0" target="_blank"></a><strong>C++</strong></p>
<p>http://larbin.sourceforge.net/index-eng.html</p>
<p>简介</p>
<p>　　larbin是一种开源的网络<strong>爬虫</strong>/网络蜘蛛，由法国的年轻人 Sébastien Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取，最后为搜索引擎提供广泛的数据来源。</p>
<p>　　Larbin只是一个<strong>爬虫</strong>，也就是说larbin只抓取网页，至于如何parse的事情则由用户自己完成。另外，如何存储到数据库以及建立索引的事情 larbin也不提供。</p>
<p>　　latbin最初的设计也是依据设计简单但是高度可配置性的原则，因此我们可以看到，一个简单的larbin的<strong>爬虫</strong>可以每天获取５００万的网页，非常高效。</p>
<h3><strong>Heritrix</strong></h3>
<p>开发语言：Java</p>
<p><a href="http://crawler.archive.org/" target="_blank"><strong>http://crawler.archive.org/</strong></a></p>
<p>简介</p>
<p>与Nutch比较</p>
<p>和 Nutch。二者均为Java开源框架，<strong>Heritrix</strong> 是 SourceForge上的开源产品，Nutch为Apache的一个子项目，它们都称作网络<strong>爬虫</strong>/蜘蛛（ Web Crawler），它们实现的原理基本一致：深度遍历网站的资源，将这些资源抓取到本地，使用的方法都是分析网站每一个有效的URI，并提交Http请求，从而获得相应结果，生成本地文件及相应的日志信息等。</p>
<p><strong>Heritrix</strong> 是个 &#8220;archival crawler&#8221; &#8212; 用来获取完整的、精确的、站点内容的深度复制。包括获取图像以及其他非文本内容。抓取并存储相关的内容。对内容来者不拒，不对页面进行内容上的修改。重新爬行对相同的URL不针对先前的进行替换。<strong>爬虫</strong>通过Web用户界面启动、监控、调整，允许弹性的定义要获取的URL。</p>
<p>二者的差异：</p>
<p>Nutch 只获取并保存可索引的内容。<strong>Heritrix</strong>则是照单全收。力求保存页面原貌</p>
<p>Nutch 可以修剪内容，或者对内容格式进行转换。</p>
<p>Nutch 保存内容为数据库优化格式便于以后索引；刷新替换旧的内容。而<strong>Heritrix</strong> 是添加(追加)新的内容。</p>
<p>Nutch 从命令行运行、控制。<strong>Heritrix</strong> 有 Web 控制管理界面。</p>
<p>Nutch 的定制能力不够强，不过现在已经有了一定改进。<strong>Heritrix</strong> 可控制的参数更多。</p>
<p><strong>Heritrix</strong>提供的功能没有nutch多，有点整站下载的味道。既没有索引又没有解析，甚至对于重复爬取URL都处理不是很好。</p>
<p><strong>Heritrix</strong>的功能强大 但是配置起来却有点麻烦。</p>
<h3>其他网络<strong>爬虫</strong>介绍：</h3>
<p> </p>
<p><strong>WebLech </strong><br />
WebLech是一个功能强大的Web站点下载与镜像工具。它支持按功能需求来下载web站点并能够尽可能模仿标准Web浏览器的行为。WebLech有一个功能控制台并采用多线程操作。<br />
<a href="http://weblech.sourceforge.net/" target="_blank"><strong>http://weblech.sourceforge.net/</strong></a><br />
<strong>Arale </strong><br />
Arale主要为个人使用而设计，而没有像其它<strong>爬虫</strong>一样是关注于页面索引。Arale能够下载整个web站点或来自web站点的某些资源。Arale还能够把动态页面映射成静态页面。<br />
<a href="http://web.tiscali.it/_flat/arale.jsp.html" target="_blank"><strong>http://web.tiscali.it/_flat/arale.jsp.html</strong></a></p>
<p><strong>J-Spider </strong><br />
J-Spider:是一个完全可配置和定制的Web Spider引擎.你可以利用它来检查网站的错误(内在的服务器错误等),网站内外部链接检查，分析网站的结构(可创建一个网站地图),下载整个Web站点，你还可以写一个JSpider插件来扩展你所需要的功能。<br />
<a href="http://j-spider.sourceforge.net/" target="_blank"><strong>http://j-spider.sourceforge.net/</strong></a></p>
<p><strong>spindle </strong><br />
spindle 是一个构建在Lucene工具包之上的Web索引/搜索工具.它包括一个用于创建索引的HTTP spider和一个用于搜索这些索引的搜索类。spindle项目提供了一组JSP标签库使得那些基于JSP的站点不需要开发任何Java类就能够增加搜索功能。<br />
<a href="http://www.bitmechanic.com/projects/spindle/" target="_blank"><strong>http://www.bitmechanic.com/projects/spindle/</strong></a></p>
<p><strong>Arachnid </strong><br />
Arachnid: 是一个基于Java的web spider框架.它包含一个简单的HTML剖析器能够分析包含HTML内容的输入流.通过实现Arachnid的子类就能够开发一个简单的Web spiders并能够在Web站上的每个页面被解析之后增加几行代码调用。 Arachnid的下载包中包含两个spider应用程序例子用于演示如何使用该框架。<br />
<a href="http://arachnid.sourceforge.net/" target="_blank"><strong>http://arachnid.sourceforge.net/</strong></a></p>
<p><strong>LARM </strong><br />
LARM能够为Jakarta Lucene搜索引擎框架的用户提供一个纯Java的搜索解决方案。它包含能够为文件，数据库表格建立索引的方法和为Web站点建索引的<strong>爬虫</strong>。<br />
<a href="http://larm.sourceforge.net/" target="_blank"><strong>http://larm.sourceforge.net/</strong></a></p>
<p><strong>JoBo </strong><br />
JoBo 是一个用于下载整个Web站点的简单工具。它本质是一个Web Spider。与其它下载工具相比较它的主要优势是能够自动填充form(如：自动登录)和使用cookies来处理session。JoBo还有灵活的下载规则(如：通过网页的URL，大小，MIME类型等)来限制下载。<br />
<a href="http://www.matuschek.net/software/jobo/index.html" target="_blank"><strong>http://www.matuschek.net/software/jobo/index.html</strong></a></p>
<p><strong>snoics-reptile </strong><br />
snoics -reptile是用纯Java开发的，用来进行网站镜像抓取的工具，可以使用配制文件中提供的URL入口，把这个网站所有的能用浏览器通过GET的方式获取到的资源全部抓取到本地，包括网页和各种类型的文件，如：图片、flash、mp3、zip、rar、exe等文件。可以将整个网站完整地下传至硬盘内，并能保持原有的网站结构精确不变。只需要把抓取下来的网站放到web服务器(如：Apache)中，就可以实现完整的网站镜像。<br />
<a href="http://www.blogjava.net/snoics" target="_blank"><strong>http://www.blogjava.net/snoics</strong></a></p>
<p><strong>Web-Harvest </strong><br />
Web-Harvest是一个Java开源Web数据抽取工具。它能够收集指定的Web页面并从这些页面中提取有用的数据。Web-Harvest主要是运用了像XSLT,XQuery,正则表达式等这些技术来实现对text/xml的操作。<br />
<a href="http://web-harvest.sourceforge.net/" target="_blank"><strong>http://web-harvest.sourceforge.net</strong></a></p>
<p><strong>spiderpy</strong><br />
spiderpy是一个基于Python编码的一个开源web<strong>爬虫</strong>工具，允许用户收集文件和搜索网站，并有一个可配置的界面。<br />
<a href="http://pyspider.sourceforge.net/" target="_blank"><strong>http://pyspider.sourceforge.net/</strong></a></p>
<p><strong>The Spider Web Network Xoops Mod Team </strong><br />
pider Web Network Xoops Mod是一个Xoops下的模块，完全由PHP语言实现。<br />
<a href="http://www.tswn.com/" target="_blank"><strong>http://www.tswn.com/</strong></a></p>
<p>HiSpider is a fast and high performance spider with high speed</p>
<p>严格说只能是一个spider系统的框架, 没有细化需求, 目前只是能提取URL, URL排重, 异步DNS解析, 队列化任务, 支持N机分布式下载, 支持网站定向下载(需要配置hispiderd.ini <strong>whitelist</strong>).</p>
<p><strong>特征和用法:</strong></p>
<ul>
<li>基于unix/linux系统的开发</li>
<li>异步DNS解析</li>
<li>URL排重</li>
<li>支持HTTP 压缩编码传输 gzip/deflate</li>
<li>字符集判断自动转换成UTF-8编码</li>
<li>文档压缩存储</li>
<li>支持多下载节点分&#8230;</li>
</ul>
<p> </p>
<p>Methanol 是一个模块化的可定制的网页爬虫软件，主要的优点是速度快。</p>
</div>
</div>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2009/12/20%e5%bc%80%e6%ba%90%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e7%b3%bb%e7%bb%9f/' rel='bookmark' title='Permanent Link: 20开源搜索引擎系统'>20开源搜索引擎系统</a></li>
<li><a href='http://cq-cser.cn/2009/12/seo%e6%89%93%e6%89%8b/' rel='bookmark' title='Permanent Link: SEO打手'>SEO打手</a></li>
<li><a href='http://cq-cser.cn/2010/01/9%e4%b8%aaphp%e5%ba%93%e7%ae%80%e4%bb%8b%e5%92%8c%e4%b8%8b%e8%bd%bd/' rel='bookmark' title='Permanent Link: 9个PHP库简介和下载'>9个PHP库简介和下载</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/06/%e5%bc%80%e6%ba%90%e7%bd%91%e7%bb%9c%e7%88%ac%e8%99%ab%e4%bb%8b%e7%bb%8d%e5%8f%8a%e5%85%b6%e6%af%94%e8%be%83/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JSP空间部署</title>
		<link>http://cq-cser.cn/2010/06/jsp%e7%a9%ba%e9%97%b4%e9%83%a8%e7%bd%b2/</link>
		<comments>http://cq-cser.cn/2010/06/jsp%e7%a9%ba%e9%97%b4%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 00:26:01 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[JSP]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1214</guid>
		<description><![CDATA[下载j2sdk-1_4_1_02-windows-i586.exe和jakarta-tomcat-4.1.31.exe 经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题，于是总结了一下如何tomcat下配置jsp、servlet 和ben，希望对那些初学者有所帮助。 一、开发环境配置 第一步：下载j2sdk和tomcat：到sun官方站点（http: //java.sun.com/j2se/1.4.2/download.html）下载j2sdk，注意下载版本为Windows Offline Installation的SDK，同时最好下载J2SE 1.4.2 Documentation，然后到tomcat官方站点（http://www.apache.org/dist/jakarta/tomcat- 4/）下载tomcat（下载最新4.1.x版本的tomcat）； 第二步：安装和配置你的j2sdk和tomcat：执行j2sdk和tomcat的安装程序，然后按默认设置进行安装即可。 1.安装j2sdk以后，需要配置一下环境变量，在我的电脑-&#62;属性-&#62;高级-&#62;环境变量-&#62;系统变量中添加以下环境变量(假定 你的j2sdk安装在c:\j2sdk1.4.2）： JAVA_HOME=c:\j2sdk1.4.2 classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;（.;一定不能少，因为 它代表当前路径) path=%JAVA_HOME%\bin 接着可以写一个简单的java程序来测试J2SDK是否已安装成功： public class Test{ public static void main(String args[]){ System.out.println(&#8220;This is a test program.&#8221;); } } 将上面的这段程序保存为文件名为Test.java的文件。 然后打开命令提示符窗口，cd到你的Test.java所在目录，然后键入下面的命令 javac Test.java java Test 此时如果看到打印出来This is a test program.的话说明安装成功了，如果没有打印出这句话，你需要仔细检查一下你的配置情况。 2.安装Tomcat后，在我的电脑-&#62;属性-&#62;高级-&#62;环境变量-&#62;系统变量中添加以下环境变量(假定你的tomcat安装在 c:\tomcat)： CATALINA_HOME=c:\tomcat CATALINA_BASE=c:\tomcat 然后修改环境变量中的classpath，把tomat安装目录下的common\lib下的(可以根据实际追加)servlet.jar追加到 classpath中去，修改后的classpath如下： classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar; 接着可以启动tomcat，在IE中访问http://localhost:8080，如果看到tomcat的欢迎页面的话说明安装成功了。 第三步：建立自己的jsp app目录 [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2010/02/extjs%e9%80%9a%e8%bf%87json%e4%b8%8e%e5%90%8e%e5%8f%b0%e9%80%9a%e4%bf%a1/' rel='bookmark' title='Permanent Link: ExtJs通过JSON与后台通信'>ExtJs通过JSON与后台通信</a></li>
<li><a href='http://cq-cser.cn/2009/12/asp-netc%e5%88%a9%e7%94%a8rar%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e5%8e%8b%e7%bc%a9/' rel='bookmark' title='Permanent Link: asp.net(c#)利用RAR实现文件压缩'>asp.net(c#)利用RAR实现文件压缩</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<table>
<tbody>
<tr>
<td>
<div id="blog_text">
<p>下载j2sdk-1_4_1_02-windows-i586.exe和jakarta-tomcat-4.1.31.exe</p>
<p>经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题，于是总结了一下如何tomcat下配置jsp、servlet 和ben，希望对那些初学者有所帮助。 <span id="more-1214"></span><br />
一、开发环境配置<br />
第一步：下载j2sdk和tomcat：到sun官方站点（http: //java.sun.com/j2se/1.4.2/download.html）下载j2sdk，注意下载版本为Windows Offline Installation的SDK，同时最好下载J2SE 1.4.2 Documentation，然后到tomcat官方站点（http://www.apache.org/dist/jakarta/tomcat- 4/）下载tomcat（下载最新4.1.x版本的tomcat）；<br />
第二步：安装和配置你的j2sdk和tomcat：执行j2sdk和tomcat的安装程序，然后按默认设置进行安装即可。<br />
1.安装j2sdk以后，需要配置一下环境变量，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量(假定 你的j2sdk安装在c:\j2sdk1.4.2）：<br />
JAVA_HOME=c:\j2sdk1.4.2<br />
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;（.;一定不能少，因为 它代表当前路径)<br />
path=%JAVA_HOME%\bin<br />
接着可以写一个简单的java程序来测试J2SDK是否已安装成功：<br />
public class Test{<br />
public static void main(String args[]){<br />
System.out.println(&#8220;This is a test program.&#8221;);<br />
}<br />
}<br />
将上面的这段程序保存为文件名为Test.java的文件。<br />
然后打开命令提示符窗口，cd到你的Test.java所在目录，然后键入下面的命令<br />
javac Test.java<br />
java Test<br />
此时如果看到打印出来This is a test program.的话说明安装成功了，如果没有打印出这句话，你需要仔细检查一下你的配置情况。<br />
2.安装Tomcat后，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量(假定你的tomcat安装在 c:\tomcat)：<br />
CATALINA_HOME=c:\tomcat<br />
CATALINA_BASE=c:\tomcat<br />
然后修改环境变量中的classpath，把tomat安装目录下的common\lib下的(可以根据实际追加)servlet.jar追加到 classpath中去，修改后的classpath如下：<br />
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar;<br />
接着可以启动tomcat，在IE中访问http://localhost:8080，如果看到tomcat的欢迎页面的话说明安装成功了。<br />
第三步：建立自己的jsp app目录<br />
1.到Tomcat的安装目录的webapps目录，可以看到ROOT，examples, tomcat-docs之类Tomcat自带的的目录；<br />
2.在webapps目录下新建一个目录，起名叫myapp；<br />
3.myapp下新建一个目录WEB-INF，注意，目录名称是区分大小写的；<br />
4.WEB-INF下新建一个文件web.xml，内容如下：<br />
&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;ISO-8859-1&#8243;?&gt;<br />
&lt;!DOCTYPE web-app<br />
PUBLIC &#8220;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&#8221;<br />
&#8220;http://java.sun.com/dtd/web-app_2_3.dtd&#8221;&gt;<br />
&lt;web-app&gt;<br />
&lt;display-name&gt;My Web Application&lt;/display-name&gt;<br />
&lt;description&gt;<br />
A application for test.<br />
&lt;/description&gt;<br />
&lt;/web-app&gt;<br />
5.在myapp下新建一个测试的jsp页面，文件名为index.jsp，文件内容如下：<br />
&lt;html&gt;&lt;body&gt;&lt;center&gt;<br />
Now time is: &lt;%=new java.util.Date()%&gt;<br />
&lt;/center&gt;&lt;/body&gt;&lt;/html&gt;<br />
6.重启Tomcat<br />
7.打开浏览器，输入http://localhost:8080/myapp/index.jsp 看到当前时间的话说明就成功了。<br />
第四步：建立自己的Servlet：<br />
1.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个servlet程序，文件名为Test.java，文件内容如下：<br />
package test;<br />
import java.io.IOException;<br />
import java.io.PrintWriter;<br />
import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServlet;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;<br />
public class Test extends HttpServlet {<br />
protected void doGet(HttpServletRequest request, HttpServletResponse response)<br />
throws ServletException, IOException {<br />
PrintWriter out=response.getWriter();<br />
out.println(&#8220;&lt;html&gt;&lt;body&gt;&lt;h1&gt;This is a servlet test.&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;&#8221;);<br />
out.flush();<br />
}<br />
}<br />
2 .编译<br />
将Test.java放在c:\test下，使用如下命令编译：<br />
C:\Test&gt;javac Test.java<br />
然后在c:\Test下会产生一个编译后的servlet文件：Test.class<br />
3 .将结构test\Test.class剪切到%CATALINA_HOME%\webapps\myapp\WEB-INF\classes下，也就是 剪切那个test目录到classes目录下，如果classes目录不存在，就新建一个。 现在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目录结构<br />
4 .修改webapps\myapp\WEB-INF\web.xml，添加servlet和servlet-mapping<br />
编辑后的web.xml如下所示，红色为添加的内容:<br />
&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;ISO-8859-1&#8243;?&gt;<br />
&lt;!DOCTYPE web-app<br />
PUBLIC &#8220;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&#8221;<br />
&#8220;http://java.sun.com/dtd/web-app_2_3.dtd&#8221;&gt;<br />
&lt;web-app&gt;<br />
&lt;display-name&gt;My Web Application&lt;/display-name&gt;<br />
&lt;description&gt;<br />
A application for test.<br />
&lt;/description&gt;<br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />
&lt;display-name&gt;Test&lt;/display-name&gt;<br />
&lt;description&gt;A test Servlet&lt;/description&gt;<br />
&lt;servlet-class&gt;test.Test&lt;/servlet-class&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/Test&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;<br />
&lt;/web-app&gt;<br />
这段话中的servlet这一段声明了你要调用的Servlet，而servlet-mapping则是将声明的servlet&#8221;映射&#8221;到地址/Test上<br />
5 .好了，重启动Tomcat，启动浏览器，输入http://localhost:8080/myapp/Test 如果看到输出This is a servlet test.就说明编写的servlet成功了。<br />
注意：修改了web.xml以及新加了class，都要重启Tomcat<br />
第四步：建立自己的Bean：<br />
1.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个java程序，文件名为TestBean.java，文件内容如下：<br />
package test;<br />
public class TestBean{<br />
private String name = null;<br />
public TestBean(String strName_p){<br />
this.name=strName_p;<br />
}<br />
public void setName(String strName_p){<br />
this.name=strName_p;<br />
}<br />
public String getName(){<br />
return this.name;<br />
}<br />
}<br />
2 .编译<br />
将TestBean.java放在c:\test下，使用如下命令编译：<br />
C:\Test&gt;javac TestBean.java<br />
然后在c:\Test下会产生一个编译后的bean文件：TestBean.class<br />
3 .将TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下，<br />
4 .新建一个TestBean.jsp文件，文件内容为：<br />
&lt;%@ page import=&#8221;test.TestBean&#8221; %&gt;<br />
&lt;html&gt;&lt;body&gt;&lt;center&gt;<br />
&lt;%<br />
TestBean testBean=new TestBean(&#8220;This is a test java bean.&#8221;);<br />
%&gt;<br />
Java bean name is: &lt;%=testBean.getName()%&gt;<br />
&lt;/center&gt;&lt;/body&gt;&lt;/html&gt;<br />
5 .好了，重启Tomcat，启动浏览器，输入http://localhost:8080/myapp/TestBean.jsp 如果看到输出Java bean name is: This is a test java bean.就说明编写的Bean成功了。<br />
这样就完成了整个Tomcat下的jsp、servlet和javabean的配置。接下来需要做的事情就是多看书、多读别人的好代码，自己多动手写代码 以增强自己在这方面开发的能力了。</p>
<p>jvm应填写到<br />
c:\j2sdk\bin</p>
<p>给你一个简单的配置：：：：</p>
<p>JSP环境配置心得<br />
首先要说的是，使用jdk+tomcat完全可以配置我们的jsp服务器，不再需要其实任何东东，有很多文章介绍了Apache，其实根本用不着，一般的 学习调试tomcat完全可以胜任了。<br />
安装jdk后，tomcat在安装之前会自动找到jdk的安装路径，一路点击&#8221;下一步&#8221;，经过一段时间的文件复制，最后&#8221;close&#8221;，完成comcat的安装。<br />
您最好去下载一个版本较高的tomcat，比如4.1以上的，因为它不需要设置太多的系统变量，右击&#8221;我的电脑&#8221;，选择&#8221;属性&#8221;-&gt;&#8221;高级&#8221;- &gt;&#8221;环境变量&#8221;-&gt;&#8221;系统变量&#8221;，新建一个TOMCAT_HOME，值设置成你的tomcat所在的路径，比如：D:\Program Files\Apache Group\Tomcat 4.1，配置完成。<br />
从开始菜单中找到tomcat选项，一般打开顺序是：开始-&gt;程序-&gt;Apache Tomcat 4.1，选择&#8221;Start Tomcat&#8221;，让jsp服务器开始运行，此时会打开一个类似Dos的窗口，会显示一些相关的信息。<br />
如果您使用代理上网，一定要先撤掉代理，不然您的jsp程序永远也得不到执行。如果不是代理的，这一步就跳过了。<br />
打开浏览器，在地址栏中输入：http://localhost:8080，如果看到有老虎（我也不知道是老虎还是猫）的画面，恭喜您，您成功了一半。<br />
先来享受一下成功的喜悦吧，请输入下面的代码：<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;First Page&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;H3&gt;Today is: h<br />
&lt;%= new java.util.Date() %&gt;<br />
&lt;/H3&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
将该程序保存为:First.jsp，放到Tomcat的ROOT目录下，然后在浏览器的地址栏中输入：http://localhost: 8080/First.jsp，(First.jsp跟我们保存的文件名的大小写要一致)回车，如果不出意外，应该可以看到形如Today is: h Fri Apr 11 08:32:38 CST 2003 的结果。<br />
注意：ROOT是tomcat的默认虚拟目录，如果要改成自己的虚拟目录怎么办呢？请继续往下看吧。<br />
要改成自己的虚拟目录，就要请出server.xml来了，该文件是一个配置文件，在Tomcat\conf目录下，使用任何文本编辑软件都能打开它，我 们先找到下面一句：<br />
&lt;Connector className=&#8221;org.apache.coyote.tomcat4.CoyoteConnector&#8221;<br />
port=&#8221;8080&#8243; minProcessors=&#8221;5&#8243; maxProcessors=&#8221;75&#8243;<br />
enableLookups=&#8221;true&#8221; redirectPort=&#8221;8443&#8243;<br />
acceptCount=&#8221;100&#8243; debug=&#8221;0&#8243; connectionTimeout=&#8221;20000&#8243;<br />
useURIValidationHack=&#8221;false&#8221; disableUploadTimeout=&#8221;true&#8221; /&gt;<br />
这里的port=&#8221;8080&#8243;就是端口，我们完全可以用别的端口来代替，但不能是被系统占用的端口（0&#8211;1023），这里简单提一下。<br />
下面我们再往下找，会发现以下的语句：<br />
&lt;/Context&gt;<br />
&lt;/Host&gt;<br />
我们就应该找到这两个语句，如果不懂E文，您就认定这两个语句好了。然后我们将该语句更改如下：<br />
&lt;/Context&gt;<br />
&lt;Context path=&#8221;/myjsp&#8221; debug=&#8221;0&#8243; docBase=&#8221;e:/myjsp&#8221; reloadable=&#8221;true&#8221;&gt;<br />
&lt;/Context&gt;<br />
&lt;/Host&gt;<br />
这里的path=&#8221;/myjsp&#8221;就是我们就配置的虚拟目录了，以后在地址栏中输入http://localhost:8080/myjsp即可。而 docBase=&#8221;e:/myjsp&#8221; 则是机器本地路径，他们通过这个语句形成一个映射关系，其它照抄。<br />
将上面的First.jsp文件放到e:/myjsp目录下，输入http://localhost:8080/myjsp/First.jsp，是不是 有一种喜上眉梢的感觉？<br />
在论坛里我见得最多的就是很多人不知道javaBean文件放到哪里，老实说开始我也不知道，更令人不解的是，十个人有九种不同的说法，这更让我们茫然。 其实这问题也不是我们想像的那么复杂，我们以一个例子说明：<br />
先建立一个java程序，代码如下：<br />
package hall;<br />
public class SimpleBean {<br />
private String message = &#8220;No message specified&#8221;;<br />
public String getMessage() {<br />
return(message);<br />
}<br />
public void setMessage(String message) {<br />
this.message = message;<br />
}<br />
}<br />
保存为SimpleBean.java，编译后会生成一个包，其实就相当于一个目录，也就是SimpleBean.class会存放在hall目录中，暂 且保存起来，将来备用。<br />
再输入以下代码：<br />
&lt;HTML&gt;<br />
&lt;HEAD&gt;<br />
&lt;TITLE&gt;Reusing JavaBeans in JSP&lt;/TITLE&gt;<br />
&lt;/HEAD&gt;<br />
&lt;BODY&gt;<br />
&lt;CENTER&gt;<br />
&lt;TABLE BORDER=5&gt;<br />
&lt;TR&gt;&lt;TH&gt;<br />
Reusing JavaBeans in JSP&lt;/TABLE&gt;<br />
&lt;/CENTER&gt;<br />
&lt;P&gt;<br />
&lt;jsp:useBean id=&#8221;test&#8221; /&gt;<br />
&lt;jsp:setProperty name=&#8221;test&#8221; property=&#8221;message&#8221; value=&#8221;Hello WWW&#8221; /&gt;<br />
&lt;H1&gt;Message: &lt;I&gt;<br />
&lt;jsp:getProperty name=&#8221;test&#8221; property=&#8221;message&#8221; /&gt;<br />
&lt;/I&gt;&lt;/H1&gt;<br />
&lt;/BODY&gt;<br />
保存在我们刚才建立的虚拟目录e:/myjsp下面，并命名为：BeanTest.jsp。<br />
现在我们应该将hall（包）目录放在哪儿呢？别急，我们先在e:/myjsp下建立一个文件夹WEB-INF，然后再在WEB-INF下建立一个 classes文件夹，最后将hall目录放到classes下，当然，hall下的字节码文件SimpleBean.class也一并要移过来，而 SimpleBean.java就和BeanTest.jsp放到同一目录吧（可以不需要放的，自己试试）。<br />
好了，大功告成了，重新启动机器（如果您试了好多次都不行，这一步一定要做），在浏览器中输入：http://localhost: 8080/myjsp/BeanTest.jsp，您看到了什么？呵，别告诉我您什么都没看到，那肯定是您设置的问题了。<br />
好了，文章写完了，我也只是一只菜鸟，所以有写的不准备的地方请多多指教。祝您jsp之旅一路顺风！！！<br />
Java学习 &#8211; 技术文章中心<br />
初学者问的诸如：《怎样配置环境变量》《怎样运行Servlet》啊？这样的问题太多了，现在我写一个初学者入门必读，以便对初学者有指导作用！<br />
首先是下载工具：<br />
我建议初学者用Editplus＋JDK，我觉得如果用例如JB，Eclipse，JCreator，虽然刚开始的时候比较方便，但是确使初学者门不知道 怎样配置环境变量，<br />
从而难以达到知其然，知其所以然的地步<br />
可以通过如下地址下载：<br />
Editplus(最新版本是v2.11)：http://count.skycn.com/softdown.php?id=3641&amp;url =http://sc-http.skycn.net/down/epp211a_cn.exe(要照注册码就自己找吧，网上很多的）<br />
JDK(最新版本是Java2sdk1_4_2)：http://count.skycn.com/softdown.php?id=3116&amp; url=http://sc-http.skycn.net/down/j2sdk-1_4_2-windows-i586.exe（这是For Windows）<br />
然后就是安装JDK，我是把它装到从c:\JDK目录下面：<br />
然后就是CLASSPATH的问题了：<br />
正如操作系统利用PATH来搜索可执行程序一样，Java运行环境也会遍历CLASSPATH来查找类，即便是HelloWorld这样简单的程序，JVM也会遍历<br />
CLASSPATH定义的每一个路径，直到找到相应的文件为止。<br />
相信大家用的系统不是2k就是XP，然后就应当如下设置Path：<br />
我的电脑-&gt;属性-&gt;高级-&gt;环境变量<br />
然后在环境变量的Path后面追加: C:\JDK\bin;.;C:\JDK\lib<br />
也可以这样配置:C:\JDK\bin;.;C:\JDK\lib\dt.jar;C:\JDK\lib\tools.jar<br />
★记住:环境变量中的 . 切记不能少，它表示当前路径，如果少掉出现的错误等会就说！<br />
dt.jar是关于运行环境的类库，tools.jar是关于一些工具的类库<br />
如果没有配置:C:\JDK\bin，则会出现 &#8221; javac´ 不是内部或外部命令，也不是可运行的程序或批处理文件。&#8221;这样的错误。<br />
然后下面就该写程序了：<br />
首先是(HelloWorld.java),打开Editplus，新建一个Java文件，请照着如下输入，要一字不漏，并且分清大小写：<br />
public class HelloWorld{<br />
public static void main(String[] args){<br />
System.out.println(&#8220;Hello,World!&#8221;);<br />
}<br />
}<br />
然后把这个文件保存(ctrl + s)到HelloWorld.java,记住大小写一定要分清，是HelloWorld.java不是helloworld.java或者其它的<br />
下面就该运行了，开始-&gt;运行-&gt;cmd<br />
在控制台中把目录切换到当前目录：<br />
javac HelloWorld.java<br />
java HelloWorld<br />
你就会在控制台上看见输出的Hello,World!(没出来？我把电脑吃了：）)<br />
javac是编译命令，它把HelloWorld.java编译成HelloWorld.class<br />
java就是解释命令，JVM把HelloWorld.class解释执行.<br />
在这个时候：<br />
1。如果出现Exception in thread &#8220;main&#8221; java.lang.NoClassDefFoundError: HelloWorld<br />
那就是你在环境变量中没有加上那个.(dot)<br />
2。如果出现Exception in thread &#8220;main&#8221; java.lang.NoSuchMethodError: main<br />
或者HelloWorld.java:1: Public class helloworld must be defined in a file called<br />
&#8220;HelloWorld.java&#8221;.<br />
那就是你没有分清大小写的写入这个HelloWorld，或者保存得时候没有保存为HelloWorld.java<br />
这个名字一定要跟public class的名字一样<br />
对于环境变量的问题就说到这里，下面我先所说怎么在Editplus里面编译和运行，在Tools－&gt;参数设置-&gt;配置用户工具<br />
1.添加工具（添加应用程序）<br />
菜单文字：Compile Java Program<br />
程序：C:\JDK\bin\javac.exe<br />
参数：文件名称<br />
初始目录：文件目录<br />
2.添加工具（添加应用程序）<br />
菜单文字：Run Java Program<br />
程序：C:\JDK\bin\java.exe<br />
参数：文件名称（不含扩展名）<br />
初始目录：文件目录<br />
工具组名称可以随便添，比如Debug Java Program<br />
然后在Tools的下拉菜单中，你就会看见Compile Java Program以及Run Java Program这两个选项，以后你就可以利用ctrl + 1编译和ctrl ＋2运行程序了</p>
<p>下面就讨论Servlet的运行：<br />
首先要运行Servlet，则需要JSP/Servlet container，我建议初学者用Tomcat<br />
Tomcat（最新版本5.0）：http://cvs.apache.org/builds/jakarta-tomcat- 5/nightly/jakarta-tomcat-5-bin-20030725.zip<br />
然后把这个压缩包解压到：<br />
C:\Tomcat<br />
然后再配置环境变量：<br />
添加三个系统变量：<br />
JAVA_HOME: C:\JDK<br />
TOMCAT_HOME: C:\Tomcat<br />
CLASSPATH: %JAVA_HOME%\lib;%TOMCAT_HOME%\lib<br />
Tomcat的环境变量就配置完毕了，下面检验Tomcat是否能够运行：<br />
在控制台中转到C:\Tomcat\bin这个目录，运行startup，然后回出现一个窗口，连跳一大串东西，最后表示Server已经运行<br />
在浏览器中输入http://localhost:8080，出现欢迎界面，则表示Tomcat没问题了<br />
然后和上面一样，写入你的第一个Servlet<br />
import java.io.*;<br />
import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
public class HelloWorld extends HttpServlet<br />
{<br />
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException<br />
{<br />
response.setContentType(&#8220;text/html&#8221;);<br />
PrintWriter out = response.getWriter();<br />
out.println(&#8220;&lt;html&gt;&lt;head&gt;&lt;title&gt;&#8221;);<br />
out.println(&#8220;This is my first Servlet&#8221;);<br />
out.println(&#8220;&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&#8221;);<br />
out.println(&#8220;&lt;h1&gt;Hello,World!&lt;/h1&gt;&#8221;);<br />
out.println(&#8220;&lt;/body&gt;&lt;/html&gt;&#8221;);</p>
<p>}<br />
}<br />
然后照样用javac HelloWorld.java来编译这个文件，如果出现无法import javax.servlet.*<br />
那么就是应该把C:\Tomcat\common\lib里面的servlet.jar（根据实际来看）文件拷贝到C:\JDK\jre\lib\ext 中，再次编译，就没有问题了！<br />
然后在Tomcat目录里面的C:\Tomcat\webapps\ROOT里面按如下的文件结构：<br />
ROOT\index.html<br />
ROOT\welcom.jsp<br />
ROOT\WEB-INF\lib\MyServlet.jar（如果你的servlet的.class打成了.jar文件，则放在lib下面)<br />
ROOT\WEB-INF\classes\HelloWorld.class(把上面生成的HelloWorld.class文件放在这个里面)<br />
然后在浏览器中输入http://localhost:8080/servlet/HelloWorld,于是Server众望所归的报错了:Error 404&#8211;Not Found<br />
怎么回事呢？<br />
Servlet必须使用C:\Tomcat\webapps\ROOT\WEB-INF这个目录下面的web.xml文件进行注册，用EP打开这个web.xml文件，<br />
在里面加入<br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;HelloWorld&lt;/servlet-class&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/servlet/helloworld&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;<br />
这样的结构<br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;HelloWorld&lt;/servlet-class&gt;<br />
&lt;/servlet&gt;<br />
表示指定包含的servlet类.<br />
而以下的结构<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/servlet/HelloWorld&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;<br />
表示指定HelloServlet应当映射到哪一种URL模式。<br />
在修改web.xml完毕过后，重新启动Server，然后再输入http://localhost:8080/servlet/HelloWorld， 那么偌大一个Hello,World!等着你呢，恭喜你</p>
</div>
</td>
</tr>
</tbody>
</table>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/02/extjs%e9%80%9a%e8%bf%87json%e4%b8%8e%e5%90%8e%e5%8f%b0%e9%80%9a%e4%bf%a1/' rel='bookmark' title='Permanent Link: ExtJs通过JSON与后台通信'>ExtJs通过JSON与后台通信</a></li>
<li><a href='http://cq-cser.cn/2009/12/asp-netc%e5%88%a9%e7%94%a8rar%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e5%8e%8b%e7%bc%a9/' rel='bookmark' title='Permanent Link: asp.net(c#)利用RAR实现文件压缩'>asp.net(c#)利用RAR实现文件压缩</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/06/jsp%e7%a9%ba%e9%97%b4%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS EDITOR</title>
		<link>http://cq-cser.cn/2010/05/css-editor/</link>
		<comments>http://cq-cser.cn/2010/05/css-editor/#comments</comments>
		<pubDate>Sat, 29 May 2010 08:09:39 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1207</guid>
		<description><![CDATA[WEB开发中，你也许会使用一个全功能的IDE或源代码编辑器，但CSS编辑器可提供专门的功能和特点，帮助您更快更好的撰写CSS。 1.EnginSite CSS Editor EnginSite CSS Editor是一个很好的CSS“即时”预览编辑器。此编辑器是开始简 单任务和设计师设计重点的理想工具。 2.CSSEdit CSSEdit屹立在世界的发展与先进的网络编辑和基本的中间。CSS编辑漂亮和干净。这是最 适合第一次进行CSS编码的人员。 3.Stylizer Stylizer是一个可视化的CSS代码编辑器。它具有实时预览的功能。它还具有指向和点击界 面，让您的目标通过点击网页元素，使CSS编辑不在话下。 Stylizer仅适用于Windows和 Mac OS。 4.Style Master Style Master是一个跨平台的CSS开发中的应用，与强大的功能设置，例如自动 完成功能。它还有一个功能叫做支持监视器，警告可能某些浏览器会不兼容的的CSS。 5.RapidCSS RapidCSS是理想的编写CSS代码，它重量轻，提供了多种功能，如代码自动完成，语法 高亮，内置的CSS参考和标签的CSS各种捷径。 6.Free CSS Toolbox Free CSS toolbox对CSS是一种简单的文本编辑器。这是非常轻便和易于使用。它有一 个语法高亮显示功能，代码自动完成，CSS验证器和压缩机。 7.CoffeeCup StyleSheet Maker CoffeeCup StyleSheet Maker是另一个CSS编辑器可以提供许多功能，但缺点是不灵 活。 8.JellyFish-CSS JellyFish CSS 是一个聪明，简单的CSS编辑器。它有助于编辑CSS代码方便，快捷。 它还将帮助您避开与它的代码感觉功能不一致的CSS语法错误。 9.SnapCSS SnapCSS只是一个窗口的CSS编辑器，但是非常轻巧，具有一个超级简单的文本编辑器接 口。它有一个美化的代码功能，可以自动格式化和规范你的CSS。 10.SimpleCSS SimpleCSS是Mac OS的从头轻松地创建样式表的应用。它有一个导入功能 允许您汇集到一个文件中的几个样式。 SimpleCSS还有拖曳重新排序拖放 功能。 No related [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>WEB开发中，你也许会使用一个全功能的IDE或源代码编辑器，但CSS编辑器可提供专门的功能和特点，帮助您更快更好的撰写CSS。<span id="more-1207"></span></p>
<p>1.<a href="http://enginsite.com/css-editor.htm" target="_blank">EnginSite  CSS Editor</a><br />
<strong><img src="http://images.cnblogs.com/cnblogs_com/liguangxi8/css1.png" border="0" alt="" width="546" height="436" /></strong></p>
<p><strong>EnginSite CSS Editor</strong>是一个很好的CSS“即时”预览编辑器。此编辑器是开始简</p>
<p>单任务和设计师设计重点的理想工具。</p>
<p>2.<a href="http://macrabbit.com/cssedit/" target="_blank">CSSEdit</a><br />
<strong><img src="http://images.cnblogs.com/cnblogs_com/liguangxi8/css2.png" border="0" alt="" width="550" height="386" /></strong></p>
<p><strong>CSSEdit</strong>屹立在世界的发展与先进的网络编辑和基本的中间。CSS编辑漂亮和干净。这是最</p>
<p>适合第一次进行CSS编码的人员。</p>
<p>3.<a href="http://www.skybound.ca/" target="_blank">Stylizer</a><br />
<strong><img src="http://images.cnblogs.com/cnblogs_com/liguangxi8/Css3.png" border="0" alt="" width="546" height="329" /></strong></p>
<p><strong>Stylizer</strong>是一个可视化的CSS代码编辑器。它具有实时预览的功能。它还具有指向和点击界</p>
<p>面，让您的目标通过点击网页元素，使CSS编辑不在话下。 Stylizer仅适用于Windows和</p>
<p>Mac OS。</p>
<p>4.<a href="http://westciv.com/style_master/" target="_blank">Style  Master</a><br />
<strong><img src="http://images.cnblogs.com/cnblogs_com/liguangxi8/CSS4.png" border="0" alt="" width="478" height="303" /></strong></p>
<p><strong>Style Master</strong>是一个跨平台的CSS开发中的应用，与强大的功能设置，例如自动</p>
<p>完成功能。它还有一个功能叫做支持监视器，警告可能某些浏览器会不兼容的的CSS。</p>
<p>5.<a href="http://www.blumentals.net/rapidcss/" target="_blank">RapidCSS</a><br />
<strong><img src="http://images.cnblogs.com/cnblogs_com/liguangxi8/CSs5.png" border="0" alt="" width="546" height="374" /></strong></p>
<p><strong>RapidCSS</strong>是理想的编写CSS代码，它重量轻，提供了多种功能，如代码自动完成，语法</p>
<p>高亮，内置的CSS参考和标签的CSS各种捷径。</p>
<p>6.<a href="http://www.blumentals.net/csstool/" target="_blank">Free  CSS Toolbox</a><br />
<strong><img src="http://images.cnblogs.com/cnblogs_com/liguangxi8/CSS6.png" border="0" alt="" width="546" height="315" /></strong></p>
<p><strong>Free CSS toolbox</strong>对CSS是一种简单的文本编辑器。这是非常轻便和易于使用。它有一</p>
<p>个语法高亮显示功能，代码自动完成，CSS验证器和压缩机。</p>
<p>7.<a href="http://www.coffeecup.com/stylesheet-maker/" target="_blank">CoffeeCup StyleSheet  Maker</a><br />
<strong><img src="http://images.cnblogs.com/cnblogs_com/liguangxi8/CSS7.png" border="0" alt="" width="546" height="386" /></strong></p>
<p><strong>CoffeeCup StyleSheet Maker</strong>是另一个CSS编辑器可以提供许多功能，但缺点是不灵 活。</p>
<p>8.<a href="http://www.apple.com/downloads/macosx/internet_utilities/jellyfishcss.html" target="_blank">JellyFish-CSS</a><br />
<strong><img src="http://images.cnblogs.com/cnblogs_com/liguangxi8/CSS8.png" border="0" alt="" width="510" height="365" /></strong></p>
<p><strong>JellyFish CSS </strong>是一个聪明，简单的CSS编辑器。它有助于编辑CSS代码方便，快捷。</p>
<p>它还将帮助您避开与它的代码感觉功能不一致的CSS语法错误。</p>
<p>9.<a href="http://www.improvingcode.com/snapcss/" target="_blank">SnapCSS</a><br />
<strong><img src="http://images.cnblogs.com/cnblogs_com/liguangxi8/CSS9.png" border="0" alt="" width="550" height="387" /></strong></p>
<p><strong>SnapCSS</strong>只是一个窗口的CSS编辑器，但是非常轻巧，具有一个超级简单的文本编辑器接</p>
<p>口。它有一个美化的代码功能，可以自动格式化和规范你的CSS。</p>
<p>10.<a href="http://www.apple.com/downloads/macosx/internet_utilities/simplecss.html" target="_blank">SimpleCSS</a><br />
<strong><img src="http://images.cnblogs.com/cnblogs_com/liguangxi8/CSS10.jpg" border="0" alt="" width="450" height="360" /></strong></p>
<p><strong>SimpleCSS</strong>是Mac OS的从头轻松地创建样式表的应用。它有一个导入功能</p>
<p>允许您汇集到一个文件中的几个样式。 SimpleCSS还有拖曳重新排序拖放</p>
<p>功能。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/05/css-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>9-PHP-SKILLS</title>
		<link>http://cq-cser.cn/2010/05/9-php-skills/</link>
		<comments>http://cq-cser.cn/2010/05/9-php-skills/#comments</comments>
		<pubDate>Fri, 14 May 2010 07:31:23 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1188</guid>
		<description><![CDATA[下面是九个PHP中很有用的功能，不知道你用过了吗？ 转自：http://coolshell.cn 1. 函数的任意数目的参数 你可能知道PHP允许你定义一个默认参数的函数。但你可能并不知道PHP还允许你定义一个完全任意的参数的函数 下面是一个示例向你展示了默认参数的函数： // 两个默认参数的函数 function foo($arg1 = '', $arg2 = '') { echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; } foo('hello','world'); /* 输出: arg1: hello arg2: world */ foo(); /* 输出: arg1: arg2: */ 现在我们来看一看一个不定参数的函数，其使用到了?func_get_args()方法： // 是的，形参列表为空 function foo() { // 取得所有的传入参数的数组 $args = func_get_args(); foreach ($args as $k =&#62; $v) { [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2010/02/21%e4%b8%aa21%e4%b8%aa%e5%ae%9e%e7%94%a8php%e4%bb%a3%e7%a0%81/' rel='bookmark' title='Permanent Link: 21个21个实用PHP代码'>21个21个实用PHP代码</a></li>
<li><a href='http://cq-cser.cn/2010/04/26jquery-skills/' rel='bookmark' title='Permanent Link: 26JQUERY-SKILLS'>26JQUERY-SKILLS</a></li>
<li><a href='http://cq-cser.cn/2010/02/php%e7%bc%96%e5%86%99%e6%98%93%e8%8c%83%e9%94%99%e8%af%af/' rel='bookmark' title='Permanent Link: php编写易范错误'>php编写易范错误</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>下面是九个PHP中很有用的功能，不知道你用过了吗？<span id="more-1188"></span><br />
转自：<a href="http://coolshell.cn">http://coolshell.cn</a></p>
<h4><span>1. 函数的任意数目的参数</span></h4>
<p>你可能知道PHP允许你定义一个默认参数的函数。但你可能并不知道PHP还允许你定义一个完全任意的参数的函数</p>
<p>下面是一个示例向你展示了默认参数的函数：</p>
<pre class="brush: php;">// 两个默认参数的函数
function foo($arg1 = '', $arg2 = '') {

	echo "arg1: $arg1\n";
	echo "arg2: $arg2\n";

}

foo('hello','world');
/* 输出:
arg1: hello
arg2: world
*/

foo();
/* 输出:
arg1:
arg2:
*/</pre>
<p>现在我们来看一看一个不定参数的函数，其使用到了?<a onclick="pageTracker._trackPageview('/outgoing/us2.php.net/manual/en/function.func-get-args.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://us2.php.net/manual/en/function.func-get-args.php">func_get_args()</a>方法：</p>
<pre class="brush: php;">// 是的，形参列表为空
function foo() {

	// 取得所有的传入参数的数组
	$args = func_get_args();

	foreach ($args as $k =&gt; $v) {
		echo "arg".($k+1).": $v\n";
	}

}

foo();
/* 什么也不会输出 */

foo('hello');
/* 输出
arg1: hello
*/

foo('hello', 'world', 'again');
/* 输出
arg1: hello
arg2: world
arg3: again
*/</pre>
<h4><span>2. </span>使用 Glob() 查找文件</h4>
<p>很多PHP的函数都有一个比较长的自解释的函数名，但是，当你看到?<a onclick="pageTracker._trackPageview('/outgoing/us.php.net/manual/en/function.glob.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://us.php.net/manual/en/function.glob.php">glob()</a> 的时候，你可能并不知道这个函数是用来干什么的，除非你对它已经很熟悉了。</p>
<p>你可以认为这个函数就好?<a onclick="pageTracker._trackPageview('/outgoing/php.net/manual/en/function.scandir.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://php.net/manual/en/function.scandir.php">scandir()</a> 一样，其可以用来查找文件。</p>
<pre class="brush: php;">// 取得所有的后缀为PHP的文件
$files = glob('*.php');

print_r($files);
/* 输出:
Array
(
    [0] =&gt; phptest.php
    [1] =&gt; pi.php
    [2] =&gt; post_output.php
    [3] =&gt; test.php
)
*/</pre>
<p>你还可以查找多种后缀名</p>
<pre class="brush: php;">// 取PHP文件和TXT文件
$files = glob('*.{php,txt}', GLOB_BRACE);

print_r($files);
/* 输出:
Array
(
    [0] =&gt; phptest.php
    [1] =&gt; pi.php
    [2] =&gt; post_output.php
    [3] =&gt; test.php
    [4] =&gt; log.txt
    [5] =&gt; test.txt
)
*/</pre>
<p>你还可以加上路径：</p>
<pre class="brush: php;">$files = glob('../images/a*.jpg');

print_r($files);
/* 输出:
Array
(
    [0] =&gt; ../images/apple.jpg
    [1] =&gt; ../images/art.jpg
)
*/</pre>
<p>如果你想得到绝对路径，你可以调用?<a onclick="pageTracker._trackPageview('/outgoing/php.net/manual/en/function.realpath.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://php.net/manual/en/function.realpath.php">realpath()</a> 函数：</p>
<pre class="brush: php;">$files = glob('../images/a*.jpg');

// applies the function to each array element
$files = array_map('realpath',$files);

print_r($files);
/* output looks like:
Array
(
    [0] =&gt; C:\wamp\www\images\apple.jpg
    [1] =&gt; C:\wamp\www\images\art.jpg
)
*/</pre>
<h4><span>3. </span>内存使用信息</h4>
<p>观察你程序的内存使用能够让你更好的优化你的代码。</p>
<p>PHP 是有垃圾回收机制的，而且有一套很复杂的内存管理机制。你可以知道你的脚本所使用的内存情况。要知道当前内存使用情况，你可以使用?<a onclick="pageTracker._trackPageview('/outgoing/us2.php.net/manual/en/function.memory-get-usage.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://us2.php.net/manual/en/function.memory-get-usage.php">memory_get_usage()</a> 函数，如果你想知道使用内存的峰值，你可以调用<a onclick="pageTracker._trackPageview('/outgoing/us2.php.net/manual/en/function.memory-get-peak-usage.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://us2.php.net/manual/en/function.memory-get-peak-usage.php">memory_get_peak_usage()</a> 函数。</p>
<pre class="brush: php;">echo "Initial: ".memory_get_usage()." bytes \n";
/* 输出
Initial: 361400 bytes
*/

// 使用内存
for ($i = 0; $i &lt; 100000; $i++) {
	$array []= md5($i);
}

// 删除一半的内存
for ($i = 0; $i &lt; 100000; $i++) {
	unset($array[$i]);
}

echo "Final: ".memory_get_usage()." bytes \n";
/* prints
Final: 885912 bytes
*/

echo "Peak: ".memory_get_peak_usage()." bytes \n";
/* 输出峰值
Peak: 13687072 bytes
*/</pre>
<h4><span>4. </span>CPU使用信息</h4>
<p>使用?<a onclick="pageTracker._trackPageview('/outgoing/us2.php.net/manual/en/function.getrusage.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://us2.php.net/manual/en/function.getrusage.php">getrusage()</a> 函数可以让你知道CPU的使用情况。注意，这个功能在Windows下不可用。</p>
<pre class="brush: php;">print_r(getrusage());
/* 输出
Array
(
    [ru_oublock] =&gt; 0
    [ru_inblock] =&gt; 0
    [ru_msgsnd] =&gt; 2
    [ru_msgrcv] =&gt; 3
    [ru_maxrss] =&gt; 12692
    [ru_ixrss] =&gt; 764
    [ru_idrss] =&gt; 3864
    [ru_minflt] =&gt; 94
    [ru_majflt] =&gt; 0
    [ru_nsignals] =&gt; 1
    [ru_nvcsw] =&gt; 67
    [ru_nivcsw] =&gt; 4
    [ru_nswap] =&gt; 0
    [ru_utime.tv_usec] =&gt; 0
    [ru_utime.tv_sec] =&gt; 0
    [ru_stime.tv_usec] =&gt; 6269
    [ru_stime.tv_sec] =&gt; 0
)

*/</pre>
<p>这个结构看上出很晦涩，除非你对CPU很了解。下面一些解释：</p>
<ul>
<li>ru_oublock: 块输出操作</li>
<li>ru_inblock: 块输入操作</li>
<li>ru_msgsnd: 发送的message</li>
<li>ru_msgrcv: 收到的message</li>
<li>ru_maxrss: 最大驻留集大小</li>
<li>ru_ixrss: 全部共享内存大小</li>
<li>ru_idrss:全部非共享内存大小</li>
<li>ru_minflt: 页回收</li>
<li>ru_majflt: 页失效</li>
<li>ru_nsignals: 收到的信号</li>
<li>ru_nvcsw: 主动上下文切换</li>
<li>ru_nivcsw: 被动上下文切换</li>
<li>ru_nswap: 交换区</li>
<li>ru_utime.tv_usec: 用户态时间 (microseconds)</li>
<li>ru_utime.tv_sec: 用户态时间(seconds)</li>
<li>ru_stime.tv_usec: 系统内核时间 (microseconds)</li>
<li>ru_stime.tv_sec: 系统内核时间?(seconds)</li>
</ul>
<p>要看到你的脚本消耗了多少CPU，我们需要看看“用户态的时间”和“系统内核时间”的值。秒和微秒部分是分别提供的，您可以把微秒值除以100万，并把它添加到秒的值后，可以得到有小数部分的秒数。</p>
<pre class="brush: php;">// sleep for 3 seconds (non-busy)
sleep(3);

$data = getrusage();
echo "User time: ".
	($data['ru_utime.tv_sec'] +
	$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
	($data['ru_stime.tv_sec'] +
	$data['ru_stime.tv_usec'] / 1000000);

/* 输出
User time: 0.011552
System time: 0
*/</pre>
<p>sleep是不占用系统时间的，我们可以来看下面的一个例子：</p>
<pre class="brush: php;">// loop 10 million times (busy)
for($i=0;$i&lt;10000000;$i++) {

}

$data = getrusage();
echo "User time: ".
	($data['ru_utime.tv_sec'] +
	$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
	($data['ru_stime.tv_sec'] +
	$data['ru_stime.tv_usec'] / 1000000);

/* 输出
User time: 1.424592
System time: 0.004204
*/</pre>
<p>这花了大约14秒的CPU时间，几乎所有的都是用户的时间，因为没有系统调用。</p>
<p>系统时间是CPU花费在系统调用上的上执行内核指令的时间。下面是一个例子：</p>
<pre class="brush: php;">$start = microtime(true);
// keep calling microtime for about 3 seconds
while(microtime(true) - $start &lt; 3) {

}

$data = getrusage();
echo "User time: ".
	($data['ru_utime.tv_sec'] +
	$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
	($data['ru_stime.tv_sec'] +
	$data['ru_stime.tv_usec'] / 1000000);

/* prints
User time: 1.088171
System time: 1.675315
*/</pre>
<p>我们可以看到上面这个例子更耗CPU。</p>
<h4><span>5. </span>系统常量</h4>
<p>PHP 提供非常有用的<a onclick="pageTracker._trackPageview('/outgoing/php.net/manual/en/language.constants.predefined.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://php.net/manual/en/language.constants.predefined.php">系统常量</a> 可以让你得到当前的行号 (__LINE__)，文件 (__FILE__)，目录 (__DIR__)，函数名 (__FUNCTION__)，类名(__CLASS__)，方法名(__METHOD__) 和名字空间 (__NAMESPACE__)，很像C语言。</p>
<p>我们可以以为这些东西主要是用于调试，当也不一定，比如我们可以在include其它文件的时候使用?__FILE__ (当然，你也可以在 PHP 5.3以后使用 __DIR__ )，下面是一个例子。</p>
<pre class="brush: php;">// this is relative to the loaded script's path
// it may cause problems when running scripts from different directories
require_once('config/database.php');

// this is always relative to this file's path
// no matter where it was included from
require_once(dirname(__FILE__) . '/config/database.php');</pre>
<p>下面是使用 __LINE__ 来输出一些debug的信息，这样有助于你调试程序：</p>
<pre class="brush: php;">// some code
// ...
my_debug("some debug message", __LINE__);
/* 输出
Line 4: some debug message
*/

// some more code
// ...
my_debug("another debug message", __LINE__);
/* 输出
Line 11: another debug message
*/

function my_debug($msg, $line) {
	echo "Line $line: $msg\n";
}</pre>
<h4><span>6.生成唯一的ID</span></h4>
<p>有很多人使用 md5() 来生成一个唯一的ID，如下所示：</p>
<pre class="brush: php;">// generate unique string
echo md5(time() . mt_rand(1,1000000));</pre>
<p>其实，PHP中有一个叫?<a onclick="pageTracker._trackPageview('/outgoing/us2.php.net/manual/en/function.uniqid.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://us2.php.net/manual/en/function.uniqid.php">uniqid()</a> 的函数是专门用来干这个的：</p>
<pre class="brush: php;">// generate unique string
echo uniqid();
/* 输出
4bd67c947233e
*/

// generate another unique string
echo uniqid();
/* 输出
4bd67c9472340
*/</pre>
<p>可能你会注意到生成出来的ID前几位是一样的，这是因为生成器依赖于系统的时间，这其实是一个非常不错的功能，因为你是很容易为你的这些ID排序的。这点MD5是做不到的。</p>
<p>你还可以加上前缀避免重名：</p>
<pre class="brush: php;">// 前缀
echo uniqid('foo_');
/* 输出
foo_4bd67d6cd8b8f
*/

// 有更多的熵
echo uniqid('',true);
/* 输出
4bd67d6cd8b926.12135106
*/

// 都有
echo uniqid('bar_',true);
/* 输出
bar_4bd67da367b650.43684647
*/</pre>
<p>而且，生成出来的ID会比MD5生成的要短，这会让你节省很多空间。</p>
<h4><span>7. </span>序列化</h4>
<p>你是否会把一个比较复杂的数据结构存到数据库或是文件中？你并不需要自己去写自己的算法。PHP早已为你做好了，其提供了两个函数：?<a onclick="pageTracker._trackPageview('/outgoing/php.net/manual/en/function.serialize.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://php.net/manual/en/function.serialize.php">serialize()</a> 和 <a onclick="pageTracker._trackPageview('/outgoing/www.php.net/manual/en/function.unserialize.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://www.php.net/manual/en/function.unserialize.php">unserialize()</a>:</p>
<pre class="brush: php;">// 一个复杂的数组
$myvar = array(
	'hello',
	42,
	array(1,'two'),
	'apple'
);

// 序列化
$string = serialize($myvar);

echo $string;
/* 输出
a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";}
*/

// 反序例化
$newvar = unserialize($string);

print_r($newvar);
/* 输出
Array
(
    [0] =&gt; hello
    [1] =&gt; 42
    [2] =&gt; Array
        (
            [0] =&gt; 1
            [1] =&gt; two
        )

    [3] =&gt; apple
)
*/</pre>
<p>这是PHP的原生函数，然而在今天JSON越来越流行，所以在PHP5.2以后，PHP开始支持JSON，你可以使用 json_encode() 和 json_decode() 函数</p>
<pre class="brush: php;">// a complex array
$myvar = array(
	'hello',
	42,
	array(1,'two'),
	'apple'
);

// convert to a string
$string = json_encode($myvar);

echo $string;
/* prints
["hello",42,[1,"two"],"apple"]
*/

// you can reproduce the original variable
$newvar = json_decode($string);

print_r($newvar);
/* prints
Array
(
    [0] =&gt; hello
    [1] =&gt; 42
    [2] =&gt; Array
        (
            [0] =&gt; 1
            [1] =&gt; two
        )

    [3] =&gt; apple
)
*/</pre>
<p>这看起来更为紧凑一些了，而且还兼容于Javascript和其它语言。但是对于一些非常复杂的数据结构，可能会造成数据丢失。</p>
<h4><span>8. </span>字符串压缩</h4>
<p>当我们说到压缩，我们可能会想到文件压缩，其实，字符串也是可以压缩的。PHP提供了?<a onclick="pageTracker._trackPageview('/outgoing/php.net/manual/en/function.gzcompress.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://php.net/manual/en/function.gzcompress.php">gzcompress()</a> 和 <a onclick="pageTracker._trackPageview('/outgoing/www.php.net/manual/en/function.gzuncompress.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://www.php.net/manual/en/function.gzuncompress.php">gzuncompress()</a> 函数：</p>
<pre class="brush: php;">$string =
"Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nunc ut elit id mi ultricies
adipiscing. Nulla facilisi. Praesent pulvinar,
sapien vel feugiat vestibulum, nulla dui pretium orci,
non ultricies elit lacus quis ante. Lorem ipsum dolor
sit amet, consectetur adipiscing elit. Aliquam
pretium ullamcorper urna quis iaculis. Etiam ac massa
sed turpis tempor luctus. Curabitur sed nibh eu elit
mollis congue. Praesent ipsum diam, consectetur vitae
ornare a, aliquam a nunc. In id magna pellentesque
tellus posuere adipiscing. Sed non mi metus, at lacinia
augue. Sed magna nisi, ornare in mollis in, mollis
sed nunc. Etiam at justo in leo congue mollis.
Nullam in neque eget metus hendrerit scelerisque
eu non enim. Ut malesuada lacus eu nulla bibendum
id euismod urna sodales. ";

$compressed = gzcompress($string);

echo "Original size: ". strlen($string)."\n";
/* 输出原始大小
Original size: 800
*/

echo "Compressed size: ". strlen($compressed)."\n";
/* 输出压缩后的大小
Compressed size: 418
*/

// 解压缩
$original = gzuncompress($compressed);</pre>
<p>几乎有<span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;">50% 压缩比率。同时，你还可以使用?<a onclick="pageTracker._trackPageview('/outgoing/www.php.net/manual/en/function.gzencode.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://www.php.net/manual/en/function.gzencode.php">gzencode()</a> 和 <a onclick="pageTracker._trackPageview('/outgoing/www.php.net/manual/en/function.gzdecode.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://www.php.net/manual/en/function.gzdecode.php">gzdecode()</a> 函数来压缩，只不用其用了不同的压缩算法。</span></p>
<h4><span>9. 注册停止</span>函数</h4>
<p>有一个函数叫做?<a onclick="pageTracker._trackPageview('/outgoing/www.php.net/manual/en/function.register-shutdown-function.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://www.php.net/manual/en/function.register-shutdown-function.php">register_shutdown_function()</a>，可以让你在整个脚本停时前运行代码。让我们看下面的一个示例：</p>
<pre class="brush: php;">// capture the start time
$start_time = microtime(true);

// do some stuff
// ...

// display how long the script took
echo "execution took: ".
		(microtime(true) - $start_time).
		" seconds.";</pre>
<p>上面这个示例只不过是用来计算某个函数运行的时间。然后，如果你在函数中间调用?<a onclick="pageTracker._trackPageview('/outgoing/php.net/manual/en/function.exit.php?referer=http%3A%2F%2Fcoolshell.cn%2F');" href="http://php.net/manual/en/function.exit.php">exit()</a> 函数，那么你的最后的代码将不会被运行到。并且，如果该脚本在浏览器终止（用户按停止按钮），其也无法被运行。</p>
<p>而当我们使用了register_shutdown_function()后，你的程序就算是在脚本被停止后也会被运行：</p>
<pre class="brush: php;">$start_time = microtime(true);

register_shutdown_function('my_shutdown');

// do some stuff
// ...

function my_shutdown() {
	global $start_time;

	echo "execution took: ".
			(microtime(true) - $start_time).
			" seconds.";
}</pre>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/02/21%e4%b8%aa21%e4%b8%aa%e5%ae%9e%e7%94%a8php%e4%bb%a3%e7%a0%81/' rel='bookmark' title='Permanent Link: 21个21个实用PHP代码'>21个21个实用PHP代码</a></li>
<li><a href='http://cq-cser.cn/2010/04/26jquery-skills/' rel='bookmark' title='Permanent Link: 26JQUERY-SKILLS'>26JQUERY-SKILLS</a></li>
<li><a href='http://cq-cser.cn/2010/02/php%e7%bc%96%e5%86%99%e6%98%93%e8%8c%83%e9%94%99%e8%af%af/' rel='bookmark' title='Permanent Link: php编写易范错误'>php编写易范错误</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/05/9-php-skills/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CRLF Injection</title>
		<link>http://cq-cser.cn/2010/05/crlf-injection/</link>
		<comments>http://cq-cser.cn/2010/05/crlf-injection/#comments</comments>
		<pubDate>Tue, 04 May 2010 13:59:04 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[CRLF]]></category>
		<category><![CDATA[Injection]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1181</guid>
		<description><![CDATA[CRLF Injection attacks and HTTP Response Splitting The CRLF Injection Attack (sometimes also referred to as HTTP Response Splitting) is a fairly simple, yet extremely powerful web attack.  Hackers are actively exploiting this web application vulnerability to perform a large variety of attacks that include XSS cross-site scripting, cross-user defacement, positioning of client&#8217;s web-cache, hijacking [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2011/12/war3%e6%a0%bc%e5%bc%8f/' rel='bookmark' title='Permanent Link: WAR3格式'>WAR3格式</a></li>
<li><a href='http://cq-cser.cn/2009/11/how-to-create-and-use-wordpress-page-templates/' rel='bookmark' title='Permanent Link: How to: Create and use WordPress page templates'>How to: Create and use WordPress page templates</a></li>
<li><a href='http://cq-cser.cn/2010/01/top-ten-web-hacking-techniques-of-2009/' rel='bookmark' title='Permanent Link: Top Ten Web Hacking Techniques of 2009!'>Top Ten Web Hacking Techniques of 2009!</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h1>CRLF Injection attacks and HTTP Response Splitting</h1>
<p>The CRLF Injection Attack (sometimes also referred to as HTTP Response Splitting) is a fairly simple, yet extremely powerful web attack.  Hackers are actively exploiting this web application vulnerability to perform a large variety of attacks that include XSS cross-site scripting, cross-user defacement, positioning of client&#8217;s web-cache, hijacking of web pages, defacement and a myriad of other related attacks.  A number of years ago a number of CRLF injection vulnerabilities were also discovered in Google’s Adwords web interface.<br />
 <br />
Sounds scary to you? You bet. Are you vulnerable? Quite possibly, and this is why.</p>
<p><strong>CRLF Injection Mechanism</strong></p>
<p>CRLF (Carriage Return and Line Feed) is a very significant sequence of characters for programmers. These two special characters represent the End Of Header marker (EOH) for many Internet protocols, including, but not limited to MIME (e-mail), NTTP (newsgroups) and more importantly HTTP.  When programmers write code for web applications they split headers based on where the CRLF is found. If a malicious user is able to inject his own CRLF sequence into an HTTP stream, he is able to maliciously control the way a web application functions.</p>
<p><strong>A simple CRLF Injection example</strong></p>
<p>Suppose you run a vulnerable website that has a member section. An attacker will send an email to one of your members containing a CRLF-crafted link. This link appears to be legitimate; after all it points to your own website.  The link might look something like the one below:</p>
<p><strong><em>http://www.yoursite.com/somepage.php?page=%0d%0aContent-Type: text/html%0d%0aHTTP/1.1 200 OK%0d%0aContent-Type: text/html%0d%0a%0d%0a%3Chtml%3EHacker Content%3C/html%3E</em></strong></p>
<p>When the victim clicks on the link he will be served with the following HTML page:<br />
 <br />
<em>&lt;html&gt;Hacker Content&lt;/html&gt;<br />
</em><br />
This attack appears to simply show the words &#8220;Hacker Content&#8221; on the victim&#8217;s machine however the danger is that YOUR server has generated this HTML code, so effectively the hacker has injected HTML code into the victims browser via YOUR web server! Ouch.  More sophisticated variations of this example can lead to poisioning of the client&#8217;s web-cache, cookies, XSS, temporary or permanent defacement of web pages and even information theft.</p>
<p><strong>Example insight</strong></p>
<p>If you look closely at the malicious URL you might notice a few occurences of the pattern %0d%0a. This pattern is the HTTP equivalent of CRLF and is the reason why we call this technique it a CRLF Injection Attack.</p>
<p><strong>Known countermeasures</strong></p>
<p>The only effective countermeasure is to properly sanitize URLs that point to web pages on your site containing any server re-direction code. Finding these holes is not a trivial task; most web applications today are littered with server-side redirects so the location of these vulnerabilities is not always clear, and it is very easy to miss most of them. Normally it can take hundreds of man-hours to test all your web page redirects and therefore it is very common to use an automated tool such as a web vulnerability scanner to find such web vulnerabilities.</p>
<p><strong>Check if your website is vulnerable to CRLF injection</strong></p>
<p>Acunetix Web Vulnerability Scanner ensures website security by automatically checking for CRLF Injection, <a href="http://cq-cser.cn/wp-admin/sql-injection.htm">SQL injection</a>, <a href="http://cq-cser.cn/wp-admin/cross-site-scripting.htm">Cross site scripting</a> attacks and other vulnerabilities. It checks password strength on authentication pages and automatically audits shopping carts, forms, dynamic content and other web applications. As the scan is being completed, the software produces <a href="http://cq-cser.cn/vulnerability-scanner/regulatory-compliance.htm">detailed reports</a> that pinpoint where vulnerabilities exist. Take a <a href="http://cq-cser.cn/vulnerability-scanner/features.htm">product tour</a> or download the evaluation version today!</p>
<p><strong>Scanning for XSS vulnerabilities with Acunetix WVS Free Edition!</strong></p>
<p>To check whether your website has cross site scripting vulnerabilities, download the Free Edition from <a href="http://cq-cser.cn/cross-site-scripting/scanner.htm">here</a>. This version will scan any website / web application for <a href="http://cq-cser.cn/wp-admin/cross-site-scripting.htm">XSS vulnerabilities</a> and it will also reveal all the essential information related to it, such as the vulnerability location and remediation techniques. Scanning for XSS is normally a quick exercise (depending on the size of the web-site).</p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2011/12/war3%e6%a0%bc%e5%bc%8f/' rel='bookmark' title='Permanent Link: WAR3格式'>WAR3格式</a></li>
<li><a href='http://cq-cser.cn/2009/11/how-to-create-and-use-wordpress-page-templates/' rel='bookmark' title='Permanent Link: How to: Create and use WordPress page templates'>How to: Create and use WordPress page templates</a></li>
<li><a href='http://cq-cser.cn/2010/01/top-ten-web-hacking-techniques-of-2009/' rel='bookmark' title='Permanent Link: Top Ten Web Hacking Techniques of 2009!'>Top Ten Web Hacking Techniques of 2009!</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/05/crlf-injection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>随笔-MD5悲剧-c#</title>
		<link>http://cq-cser.cn/2010/04/%e9%9a%8f%e7%ac%94-md5%e6%82%b2%e5%89%a7/</link>
		<comments>http://cq-cser.cn/2010/04/%e9%9a%8f%e7%ac%94-md5%e6%82%b2%e5%89%a7/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 12:15:46 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[MD5]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1163</guid>
		<description><![CDATA[图书馆对面的2小情侣给了我动力，终于搞定了课设，今晚又尝试了下MD5加解密文件系统密码，网上找了个MD5类如下，结果就悲剧了 using System; using System.Text; using System.IO; using System.Globalization; using System.Security.Cryptography;&#60;/code&#62;// 创建Key public string GenerateKey() { DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create(); return ASCIIEncoding.ASCII.GetString(desCrypto.Key); } // 加密字符串 public string EncryptString(string sInputString, string sKey) { byte [] data = Encoding.UTF8.GetBytes(sInputString); DESCryptoServiceProvider md5 = new DESCryptoServiceProvider(); md5.Key = ASCIIEncoding.ASCII.GetBytes(sKey); namespace MyFileBrowser { public class MD5 { ///MD5加密 public string [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2010/01/asp-net%e5%8a%a0%e5%af%86cookies/' rel='bookmark' title='Permanent Link: ASP.NET加密Cookies'>ASP.NET加密Cookies</a></li>
<li><a href='http://cq-cser.cn/2010/04/app-config-c%e8%af%bb%e5%86%99%e7%b1%bb/' rel='bookmark' title='Permanent Link: app.config-c#读写类'>app.config-c#读写类</a></li>
<li><a href='http://cq-cser.cn/2009/12/des%e5%8a%a0%e5%af%86%e8%a7%a3%e5%af%86%e5%87%bd%e6%95%b0-%e6%94%b6%e8%97%8f-c/' rel='bookmark' title='Permanent Link: DES加密解密函数 收藏 c#'>DES加密解密函数 收藏 c#</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><span style="COLOR: blue">图书馆对面的2小情侣给了我动力，终于搞定了课设，今晚又尝试了下MD5加解密文件系统密码，网上找了个MD5类如下，结果就悲剧了<span id="more-1163"></span></span></p>
<pre class="brush: plain;">using System;
using System.Text;
using System.IO;
using System.Globalization;
using System.Security.Cryptography;&lt;/code&gt;// 创建Key
public string GenerateKey()
{
DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
}
// 加密字符串
public string EncryptString(string sInputString, string sKey)
{
byte [] data = Encoding.UTF8.GetBytes(sInputString);
DESCryptoServiceProvider md5 = new DESCryptoServiceProvider();
md5.Key = ASCIIEncoding.ASCII.GetBytes(sKey);

namespace MyFileBrowser
{
public class MD5
{
///MD5加密
public string MD5Encrypt(string pToEncrypt, string sKey)
{
DESCryptoServiceProvider md5 = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
md5.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
md5.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, md5.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat(&quot;{0:X2}&quot;, b);
}
ret.ToString();
return ret.ToString();
}

///MD5解密
public string MD5Decrypt(string pToDecrypt, string sKey)
{
DESCryptoServiceProvider md5 = new DESCryptoServiceProvider();

byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for (int x = 0; x &amp;lt; pToDecrypt.Length / 2; x++)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}

md5.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
md5.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, md5.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();

StringBuilder ret = new StringBuilder();

return System.Text.Encoding.Default.GetString(ms.ToArray());
}

md5.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = md5.CreateEncryptor();
byte [] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
return BitConverter.ToString(result);
}
// 解密字符串
public string DecryptString(string sInputString, string sKey)
{
string [] sInput = sInputString.Split(&quot;-&quot;.ToCharArray());
byte [] data = new byte[sInput.Length];
for(int i = 0; i &amp;lt; sInput.Length; i++)
{
data[i] = byte.Parse(sInput[i], NumberStyles.HexNumber);
}
DESCryptoServiceProvider md5 = new DESCryptoServiceProvider();
md5.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
md5.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = md5.CreateDecryptor();
byte [] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
return Encoding.UTF8.GetString(result);
}
}
    /*
  class Test
{
    static void Main()
    {
        bool sy = true;
        char a;
        MD5 md5 = new MD5();
        string key = md5.GenerateKey();
        string s0 = &quot; microsoft &quot;;
        string s1 = md5.EncryptString(s0, key);
        string s2 = md5.DecryptString(s1, key);
        Console.WriteLine(&quot;原串: [{0}]&quot;, s0);
        Console.WriteLine(&quot;加密: [{0}]&quot;, s1);
        Console.WriteLine(&quot;解密: [{0}]&quot;, s2);
        while (sy)
        {
            Console.WriteLine(&quot;是否输入字符串？ Y/N&quot;);
            a = Convert.ToChar(Console.ReadLine());
            if ( a == 'Y' || a == 'y')
            {
                sy = true;
                Console.WriteLine(&quot; 请输入所要验证的字符串 &quot;);
                s0 = Console.ReadLine();
                s1 = md5.EncryptString(s0, key);
                s2 = md5.DecryptString(s1, key);
                Console.WriteLine(&quot;原串: [{0}]&quot;, s0);
                Console.WriteLine(&quot;加密: [{0}]&quot;, s1);
                Console.WriteLine(&quot;解密: [{0}]&quot;, s2);
            }
            else
                if (a == 'N' || a == 'n')
                    sy = false;
                else
                    Console.WriteLine(&quot; 您一定输错了，请重新输入 ！&quot;);
        }
    }
}
    */
}

被我注销掉的是错误引用，悲剧就从这开始了，他调用了的是子函数，于是我试着在BYTE[]和STRING之间做各种转换，搞完了发现我就是把原函数简略的写了遍，下面是MSDN的例子和一些

&lt;span style=&quot;COLOR: blue&quot;&gt;byte&lt;/span&gt;[] bytes = { 0, 1, 14, 168, 255 };
&lt;span style=&quot;COLOR: blue&quot;&gt;foreach&lt;/span&gt; (&lt;span style=&quot;COLOR: blue&quot;&gt;byte&lt;/span&gt; byteValue &lt;span style=&quot;COLOR: blue&quot;&gt;in&lt;/span&gt; bytes)
   outputBlock.Text += byteValue + &lt;span style=&quot;COLOR: #a31515&quot;&gt;&quot;\n&quot;&lt;/span&gt;;
&lt;span style=&quot;COLOR: green&quot;&gt;// The example displays the following output if the current&lt;/span&gt;
&lt;span style=&quot;COLOR: green&quot;&gt;// culture is en-US:&lt;/span&gt;
&lt;span style=&quot;COLOR: green&quot;&gt;//       0&lt;/span&gt;
&lt;span style=&quot;COLOR: green&quot;&gt;//       1&lt;/span&gt;
&lt;span style=&quot;COLOR: green&quot;&gt;//       14&lt;/span&gt;
&lt;span style=&quot;COLOR: green&quot;&gt;//       168&lt;/span&gt;
&lt;span style=&quot;COLOR: green&quot;&gt;//       255&lt;/span&gt;

 #region BYTE转换STRING
      /*  static char[] hexDigits = {
        '0', '1', '2', '3', '4', '5', '6', '7',
        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

        public static string ToHexString(byte[] bytes)
        {
            char[] chars = new char[bytes.Length * 2];
            for (int i = 0; i &amp;lt; bytes.Length; i++)
            {
                int b = bytes[i];
                chars[i * 2] = hexDigits[b &amp;gt;&amp;gt; 4];
                chars[i * 2 + 1] = hexDigits[b &amp;amp; 0xF];
            }
            return new string(chars);
        }*/
        #endregion

-----------------------------------------------------------------------------------------

最后上我的最终代码：

  #region 修改密码
        public void changepsw()
        {
            MD5 md6 = new MD5();
         // readoutkey = md5.GenerateKey();//调用产生函数
 //byte[] mykey = System.Text.Encoding.UTF8.GetBytes(readoutkey);
 //string finkey = ToHexString(mykey); //MD5公匙转换成HEXstring形式方便保存
  byte[] chang = HexToByte(readoutkey);//读出的HEXstring格式转换成BYTE
 string changs = System.Text.Encoding.Default.GetString(chang);// 转换成密匙格式
// password = md6.MD5Encrypt(&quot;123456&quot;, changs);

           temp  = md6.MD5Decrypt(password,changs);
            if (string.Compare(_txtInfo.Text,temp, true) == 0)
            {
                AboutBox1 MyDialog = new AboutBox1();
                MyDialog.Text = &quot;输入密码&quot;;
                if (MyDialog.ShowDialog() == DialogResult.OK)
                {
                    MessageBox.Show(&quot;您输入的值是：&quot; + MyDialog.textBox1.Text, &quot;信息提示&quot;, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    password = MyDialog.textBox1.Text;
                    password = md6.MD5Encrypt(password,changs);
                    byte[] tem = System.Text.Encoding.UTF8.GetBytes(password);
                    string finpass= ToHexString(tem);
                    ConfigAppSettings.SetValue(&quot;DemoKey&quot;, finpass);
                   // ConfigAppSettings.SetValue(&quot;stry&quot;,readoutkey);已有密匙
                }
                else
                {
                    MessageBox.Show(&quot;操作被取消&quot;, &quot;信息提示&quot;, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                MyDialog.Dispose();
            }
            else MessageBox.Show(&quot;在下面文本框中输入正确密码&quot;);
          
        }
        #endregion&lt;php&gt;</pre>
<p>整个SLN，VS2010U版的</p>
<p><a href="http://cq-cser.cn/wp-content/plugins/downloads-manager/upload/MyFileBrowser.rar">http://cq-cser.cn/wp-content/plugins/downloads-manager/upload/MyFileBrowser.rar</a></p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2010/01/asp-net%e5%8a%a0%e5%af%86cookies/' rel='bookmark' title='Permanent Link: ASP.NET加密Cookies'>ASP.NET加密Cookies</a></li>
<li><a href='http://cq-cser.cn/2010/04/app-config-c%e8%af%bb%e5%86%99%e7%b1%bb/' rel='bookmark' title='Permanent Link: app.config-c#读写类'>app.config-c#读写类</a></li>
<li><a href='http://cq-cser.cn/2009/12/des%e5%8a%a0%e5%af%86%e8%a7%a3%e5%af%86%e5%87%bd%e6%95%b0-%e6%94%b6%e8%97%8f-c/' rel='bookmark' title='Permanent Link: DES加密解密函数 收藏 c#'>DES加密解密函数 收藏 c#</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/04/%e9%9a%8f%e7%ac%94-md5%e6%82%b2%e5%89%a7/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>string和byte[]的相互(C#)</title>
		<link>http://cq-cser.cn/2010/04/string%e5%92%8cbyte%e7%9a%84%e7%9b%b8%e4%ba%92c/</link>
		<comments>http://cq-cser.cn/2010/04/string%e5%92%8cbyte%e7%9a%84%e7%9b%b8%e4%ba%92c/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 11:56:43 +0000</pubDate>
		<dc:creator>cq</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[byte[]]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://cq-cser.cn/?p=1161</guid>
		<description><![CDATA[string类型转成byte[]： byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); 反过来，byte[]转成string： string str = System.Text.Encoding.Default.GetString ( byteArray ); 其它编码方式的，如System.Text.UTF8Encoding，System.Text.UnicodeEncoding class等；例如： string类型转成ASCII byte[]：（&#8221;01&#8243; 转成 byte[] = new byte[]{ 0&#215;30, 0&#215;31}）  byte[] byteArray = System.Text.Encoding.ASCII.GetBytes ( str ); ASCII byte[] 转成string：（byte[] = new byte[]{ 0&#215;30, 0&#215;31} 转成 &#8220;01&#8243;） string str = System.Text.Encoding.ASCII.GetString ( byteArray ); 有时候还有这样一些需求： byte[] 转成原16进制格式的string，例如0xae00cf, 转换成 &#8220;ae00cf&#8221;；new byte[]{ 0&#215;30, 0&#215;31}转成&#8221;3031&#8243;:    public static string ToHexString(byte[] bytes) // 0xae00cf =&#62; &#8220;AE00CF &#8221;         {             string hexString = string.Empty;             if [...]


Related posts:<ol><li><a href='http://cq-cser.cn/2009/12/des%e5%8a%a0%e5%af%86%e8%a7%a3%e5%af%86%e5%87%bd%e6%95%b0-%e6%94%b6%e8%97%8f-c/' rel='bookmark' title='Permanent Link: DES加密解密函数 收藏 c#'>DES加密解密函数 收藏 c#</a></li>
<li><a href='http://cq-cser.cn/2010/04/%e9%9a%8f%e7%ac%94-md5%e6%82%b2%e5%89%a7/' rel='bookmark' title='Permanent Link: 随笔-MD5悲剧-c#'>随笔-MD5悲剧-c#</a></li>
<li><a href='http://cq-cser.cn/2010/01/asp-net%e5%8a%a0%e5%af%86cookies/' rel='bookmark' title='Permanent Link: ASP.NET加密Cookies'>ASP.NET加密Cookies</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>s<span style="FONT-FAMILY: 宋体" lang="EN-US">tring</span><span style="FONT-FAMILY: 宋体">类型转成<span lang="EN-US">byte[]</span>：</span></p>
<p><span style="FONT-FAMILY: 宋体"><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] byteArray </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Text.Encoding.Default.GetBytes ( str );</span></span></p>
<p><span style="FONT-FAMILY: 宋体"><span style="COLOR: #000000"><span style="FONT-FAMILY: 宋体">反过来，<span lang="EN-US">byte[]</span>转成<span lang="EN-US">string</span>：</span></span></span></p>
<p><span style="FONT-FAMILY: 宋体"><span style="COLOR: #000000"><span style="FONT-FAMILY: 宋体"><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> str </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Text.Encoding.Default.GetString ( byteArray );<span id="more-1161"></span></span></span></span></span></p>
<p>其它编码方式的，如System.Text.UTF8Encoding，System.Text.UnicodeEncoding class等；例如：</p>
<p>string类型转成ASCII byte[]：（&#8221;01&#8243; 转成 byte[] = new byte[]{ 0&#215;30, 0&#215;31}）</p>
<p> <span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[] byteArray </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Text.Encoding.ASCII.GetBytes ( str );</span></p>
<p><span style="COLOR: #000000"><span style="FONT-FAMILY: 宋体" lang="EN-US">ASCII byte[] </span><span style="FONT-FAMILY: 宋体">转成<span lang="EN-US">string</span>：（<span lang="EN-US">byte[] = new byte[]{ 0&#215;30, 0&#215;31} </span>转成 <span lang="EN-US">&#8220;01&#8243;</span>）</span></span></p>
<p><span style="COLOR: #000000"><span style="FONT-FAMILY: 宋体"><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000"> str </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.Text.Encoding.ASCII.GetString ( byteArray );</span></span></span></p>
<p>有时候还有这样一些需求：</p>
<p>byte[] 转成原16进制格式的string，例如0xae00cf, 转换成 &#8220;ae00cf&#8221;；new byte[]{ 0&#215;30, 0&#215;31}转成&#8221;3031&#8243;:</p>
<p>   public static string ToHexString(byte[] bytes) // 0xae00cf =&gt; &#8220;AE00CF &#8221;<br />
        {<br />
            string hexString = string.Empty;<br />
            if (bytes != null)<br />
            {<br />
                StringBuilder strB = new StringBuilder();</p>
<p>                for (int i = 0; i &lt; bytes.Length; i++)<br />
                {<br />
                    strB.Append(bytes[i].ToString(&#8220;X2&#8243;));<br />
                }<br />
                hexString = strB.ToString();<br />
            }<br />
            return hexString;<br />
        }</p>
<p>反过来，<span lang="EN-US">16</span>进制格式的<span lang="EN-US">string </span>转成<span lang="EN-US">byte[]</span>，例如<span lang="EN-US">, &#8220;ae00cf&#8221;</span>转换成<span lang="EN-US">0xae00cf</span>，长度缩减一半；<span lang="EN-US">&#8220;3031&#8243; </span>转成<span lang="EN-US">new byte[]{ 0&#215;30, 0&#215;31}:</span></p>
<p><span lang="EN-US">private static byte[] HexToByte(string hexString)<br />
        {<br />
            byte[] returnBytes = new byte[hexString.Length / 2];<br />
            for (int i = 0; i &lt; returnBytes.Length; i++)<br />
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);<br />
            return returnBytes;<br />
        }</span></p>
<p><span lang="EN-US">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;邪恶的分割线&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></p>
<p>public static byte[] GetBytes(string hexString, out int discarded)<br />
        {<br />
            discarded = 0;<br />
            string newString = &#8220;&#8221;;<br />
            char c;<br />
            // remove all none A-F, 0-9, characters<br />
            for (int i=0; i&lt;hexString.Length; i++)<br />
            {<br />
                c = hexString[i];<br />
                if (IsHexDigit(c))<br />
                    newString += c;<br />
                else<br />
                    discarded++;<br />
            }<br />
            // if odd number of characters, discard last character<br />
            if (newString.Length % 2 != 0)<br />
            {<br />
                discarded++;<br />
                newString = newString.Substring(0, newString.Length-1);<br />
            }</p>
<p>            int byteLength = newString.Length / 2;<br />
            byte[] bytes = new byte[byteLength];<br />
            string hex;<br />
            int j = 0;<br />
            for (int i=0; i&lt;bytes.Length; i++)<br />
            {<br />
                hex = new String(new Char[] {newString[j], newString[j+1]});<br />
                bytes[i] = HexToByte(hex);<br />
                j = j+2;<br />
            }<br />
            return bytes;<br />
        }</p>


<p>Related posts:<ol><li><a href='http://cq-cser.cn/2009/12/des%e5%8a%a0%e5%af%86%e8%a7%a3%e5%af%86%e5%87%bd%e6%95%b0-%e6%94%b6%e8%97%8f-c/' rel='bookmark' title='Permanent Link: DES加密解密函数 收藏 c#'>DES加密解密函数 收藏 c#</a></li>
<li><a href='http://cq-cser.cn/2010/04/%e9%9a%8f%e7%ac%94-md5%e6%82%b2%e5%89%a7/' rel='bookmark' title='Permanent Link: 随笔-MD5悲剧-c#'>随笔-MD5悲剧-c#</a></li>
<li><a href='http://cq-cser.cn/2010/01/asp-net%e5%8a%a0%e5%af%86cookies/' rel='bookmark' title='Permanent Link: ASP.NET加密Cookies'>ASP.NET加密Cookies</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cq-cser.cn/2010/04/string%e5%92%8cbyte%e7%9a%84%e7%9b%b8%e4%ba%92c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

