定义火狐的userChrome.css
0将地址栏收藏按钮移除:
#star-button { display: none !important; }
将地址栏RSS按钮移除:
#feed-button {display:none;}
解决T60的网卡的pxe-e05的错误
0问题现象(抄别人的):
http://www.nbbbs.com.cn/bbs/thread-7973-1-1.html
开机之后显示:
Intializing Intel(r) boot agent GE V1.2.31
PXE-E05: The LAN adapter’s configuation is corrupted or has not been initialized. The Boot Agent cannot continue.
等几秒后显示
ERROR
Expansion ROM not initialized – PCI on Motherboard
Bus:00, Device:00, Function:00
Press <ESC> to continue
按了<ESC>键以后能够正常开机, 感觉上什么都是正常的.
解决方法1:
开机按F1进BIOS
config-Network-Internal Network Option ROM (Enter)-设置下面那个Current setting为Disabied就可以了.
解决方法2(继续抄):
无果后在网上进行大范围的搜索,经过一番搜索,终于找到了解决办法,在老外的一个 Blog 上说,可以下载 Intel® Boot Agent PROBOOT.exe ,在纯 Dos 下执行 "IBAUtil.exe -DEFCFG" 把 EEPROM 重新刷新为出厂设置即可解决此问题。
老外也提供一个 ISO 文件提供下载,地址为:
- CDProBOOT-0.2.iso – FreeDOS boot cd-rom, customized with PROBoot Intel tools and a DOS menu selector.
- md5sum: c12babeec8e1a0e9072e9557
但是 Intel 提供的 bootcd 在仅有 NTFS 时有 Dos 路径 bug ,如果上面的 ISO 有问题,还可以下载国内网友修改后的版本,地址为:
- CDProBOOT.iso – FreeDOS boot cd-rom, customized with PROBoot Intel tools and a DOS menu selector.
- md5sum: 63624e964a31802772d3a8fa
网友提供了一个0.3的版本:http://snipurl.com/cdproboot3
下载后将该 ISO 镜像刻录为光盘(比较浪费啊,iso 才3.1M大小),光盘启动后选择 2 ,回车,还没等你反应过来,一切就已经恢复正常了。重新开机后把 BIOS 恢复为 Default ,启动不再出错, Ubuntu 也重归正常。
方法3:有线网卡不能使用的问题(Mac地址不对):
下载一个软件修正它。Mac地址在机器的后面条上:
http://www.wirelessdefence.org/Contents/MAC%20Address%20Changer.htm
方法4:
BIOS的问题,或许可以通过刷BIOS解决(经我证明不行)
最终:
pxe-05的问题没能解决,用方法1忽略它了。
用方法3,能用有线了。
估计得换主板。
凑合着用吧,又不是买的行货,就不去想保修的方法了。
参考资料:
http://www.oceanboo.cn/read.php?210
http://www.thinkpad.cn/forum/viewthread.php?tid=420871
http://www.matinfo.ch/blog/archive/2007/01/26/intel-nic-pxe-e05-error.html#post_content_extended
mysqldump导入办法
0mysqldump导入解决办法很简单,导出的时候指定字符集就行了。
mysqldump -u root -p -c –default-character-set=utf-8 wapad site > dd.sql
用户 数据库 表名
mysql -uroot -p –default-character-set=utf8 wapad < dd.sql
mysqldump -u root -p -c –default-character-set=latin1 wap_resdb downlog_bak > downlog_bak.sql
mysqldump -u root -p -c –default-character-set=latin1 wap_resdb downlog_month > downlog_month.sql
mysqldump -u root -p -c –default-character-set=latin1 wap_resdb haoduan > haoduan.sql
小姜杂谈:Canon 消费机族谱[zt]
0
这是小姜很久以前玩乐时的产物 XD。Canon 消费机的家族性非常地明显,除了可以从型号判断先后关系外,其实只看外表就可以知道谁和谁是一家的了。继续阅读里是每个现在还留存着的家族的介绍,请大家尽情享用 XD。
Canon 目前还在添加新成员的家族:
A 系列家族
主要特性:采用 AA(三号)电池、高中端都有、价格一般来说较便宜、人丁兴旺
A 家族源远流长,说它们是所有 Canon 消费机的始祖也不为过。2002 年时,A 系列分成为两支,其中 A100 的那一系在 Canon 产品线里一直是以最低端的身份存在着,有什么新功能都是最后一个才轮到它 — A100 系列的最新机种 A470 到现在都还没有防手抖呢!
2005 年在 A95 之后,A 系列又再分成了两支,A600 家族是其中一个,在特性上更接近自 A10 一脉相传的传统 A 系列。这个家族的最后一个成员是去年的 A650 IS 但目前 A600 一族的情况并不明朗,也没有小道消息说今年会不会有后继机。希望不是因为功能上太接近 G 系列,被腰斩了?A500 家族是 2005 年分家的另一支,相对于 A600 家族,走的是比较便宜的路线,规格通常也差同期的 A600 家族一截。这一脉人丁兴旺,近两年到了一年三台新机的地步。A590 IS 过了之后,下一台取名为 A1000 IS。新出来的 E1 看起来完全和 A1000IS 相同规格,只是换了个造型而已,究竟 E1 该不该分一个新系列出来,还要再观察。
最后,还有一个 2006 年时从 A500 家族中分出来的 A700 家族。小姜之所以判断是从 A500 一脉分支下来的,因为同时期的 A500 家族和 A700 家族只差一个镜头是 4x 变焦、一个是 6x 变焦而已。A2000 IS 是 A700 家族的最新成员,但因为 A2000 IS 舍弃了光学观景窗,因此究竟以后的 A700 系都是这样,还是 A2000 IS 其实是一个新系列的开始,也还要再观察。
IXUS V 家族
主要特性:Canon 最轻便的一个系列
IXUS V 家族承袭自 2000 年的第一台 Digital IXUS,以轻薄方便为主要诉求。在这个市场,Canon 算是比较晚有防手震功能的,一直到今年的 80 IS 才首度加入。2006 年时 IXUS 65 从 IXUS 55 主在线分离出来,是少了观景窗,但屏幕变为三寸大的一个系列,其它规格大多和同期的标准 IXUS 家族相仿。这个系列最新的两台是 IXUS 85 IS (有观景窗)和 IXUS 90 IS(三寸屏幕)。
IXUS 300 家族
主要特性:Canon 家族的中坚份子,功能不错,但就是没有手动曝光控制
从 IXUS 300 以降的这一脉,是 Canon 相机的「中坚份子」,在体型、功能上有着不错的平衡。自 2005 年的 IXUS 750 之后,分成了三脉:IXUS 800 IS 是比较望远的、IXUS 850 IS 有广角、IXUS 900 Ti 则是钛合金机身的「高质感」机型。三个支脉今年目前为止只有 IXUS 800 IS 的直系后代 IXUS 970 IS 推出,因此猜测 Photokina 前另外两脉也该要发布才是。
G 家族
主要特性:Canon 家族的顶级机型
Canon G 系列强调的是什么都有的顶级规格,本来自 2000 以来一直维持着一年一台,但是到了 G6 的时候 Canon 宣布以后不会再有后继机型。谁知道,2007 年时 Canon 又丢出来了一台 G7,让 G 系列又再次的沿续了下去。可惜,G7(和后来的 G9)都没有以前 G 系列的两大法宝:f/2.0 大光圈镜头和翻转式屏幕,让可用性大减。即使如此,G 系列在 Prosumer 相机中,仍然是不可忽视的一股力量。
SX 系列
主要特性:便宜的高倍望远机型
受到来自 Panasonic 和 Sony 的挑战,Canon 在 2006 年端出了 SX 这个新系列的相机。SX 系列有 10x 望远镜头,但又不像传统的炮筒体积那么大,价格也便宜许多。当然便宜就意味着部份功能的丧失 — SX 系列目前两台都没有 EVF。
S1 家族
主要特性:Canon 家族的炮筒、录像
S1 家族在最新成员 S5 IS 加入热靴之后,基本上已经接近 G 系列的等级了(但没有 RAW 输出)。S1 家族的成员也都有一颗专门的录像键,有立体声录音、还可以在录像中变焦,这些都是其它系列所没有的独家功能。有传闻说下一代要变成 20x 光学变焦,不知道真假…
zt:http://cn.engadget.com/2008/08/31/canon-consumer-camera-family/
sed 关于换行符 “\n” 的处理
0我有一段文本有多行
如:
12
23
34
我想把它换成一行
结果如下: 122334
vi中 :%s/n//g 可以合并成一行
但是使用命令 sed ‘s/n//g’ 对于换行符不起作用。
因为sed是对行操作,所以没有换行。
解决方案:
tr -d ‘n’
真的需要sed
sed -nr ‘ H;
$ {
x;
s/n//g;
p
}’
SHELL之循环语句
01、if语句
2、交互选择
3、循环判断
4、数值运算符
5、…………
if语句格式:
if [ 条件 ]
then
command
else
command
fi
交互选择(N可以为*)
echo -e “提示语言,后边有光标提供输入”c
read VAR
case $VAR in
Y)
command
;;
N)
command
;;
esac
对条件进行循环检查,成立则处理,否则继续检查
a=1
while [ "$a" = "1" ]
do
fileno=`ls -l /list/filename* |wc -l`
if [ "$fileno" = "10" ]
then
a=10
command
else
a=1
sleep 300
fi
done
grep -v www filename 过滤不包含
grep www filename 过滤包含
uniq -u 过滤没有相同行
uniq -d 过滤具有相同行
sort 排序
paste -d”;” filename1 filename2 把文件并列合并并且以;间隔
if [ "a" = "10" ] #a=10
[ "a" -ne "10" ] 同上一行
[ -s filename ] 文件大小大于0
-s 文件大小大于0返回真
-d 是一个目录是返回真
-e 文件或目录存在返回真
-g 存在是SGID返回真
-h 文件是连接文件返回真
-k 文件是粘滞位返回真
-r 文件或目录存在并可读时返回真
-w 文件或目录存在并可写时返回真
-u 文件是SUID返回真
-x 文件是可执行的返回真
-eq 等于
-ne 不等于
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
2*3+4|bc 计算前面的数据
ping -w 2 www.163.com 测试2两次
对上一次指令结果判断
$?=0 为真
$?=1 为假
给SHELL后边加参数
XXXX=`echo | wc -c`
cat $HOME/list/file.txt 1>/dev/null 2>/dev/null
OK=$?
if [ "" = "" ] || [ "$XXXX" -lt "4" ] || [ "$OK" -ne "0" ]
then
echo “参数没有输入,输入位数不等于3,file.txt不存在,请重新输入”
exit
fi
一个循环检查
line=1
for i in `cat bb`
do
qq=`echo “scale=2;$i*100″ | bc | awk -F. ”{print }”`
if [ "$qq" -ge "75" ]
then
sed -n “$line”p temp.1 >> bad.1
fi
line=`expr $line + 1` ###每次加1
在EditPlus中删除空行
0经常从网上粘贴或下载一篇文章,需要打印时,发现有大量多余的空行占据了许多篇幅,需要删除。这些空行要么不包含任何字符,要么包含了许多空格、制表符(Tab)。如果文章比较长,那么手工删除空行就成为一件颇费鼠标和精力的事。难道就没有别的办法?答案是:有!
我们可以借助文本编辑器软件EditPlus、UltraEdit实现。EditPlus、UltraEdit是常 见的共享软件,几乎所有软件下载网站都提供下载。由于EditPlus的操作更容易上手,但UltraEdit更为常用,所以本文先介绍在EditPlus的操作,再介绍UltraEdit。
一、在EditPlus中删除空行
启动EditPlus,打开待处理的文件。需要注意,必须是纯文本文件,如果是Word文档,需要先粘贴到纯文本文件中。然后,步骤如下:搜索-替换-正则表达式-当前文件-点击查找内容后面的向下箭头-选单-行首-范围内的字符-制表符-0或多次匹配-换行-形成^[t]*n
Replace with组合框保持空,表示删除查找到的内容。单击Replace按钮逐个行删除空行,或单击Replace All按钮删除全部空行(注意:EditPlus和UltraEdit均存在Replace All不能一次性完全删除空行的问题,可能是程序BUG,需要多按几次按钮)。 对于熟悉EditPlus的朋友,可以直接在Find what中输入正则表达式^[ ]* ,注意 前有空格符。
二、在UltraEdit中删除空行
使用UltraEdit的原理一样,但是UltraEdit没有提供菜单方式,所以需要手工输入正则表达式,而且UltraEdit的正则表达式符号与EditPlus不同。
用UltraEdit打开文件后,选择Search菜单的Replace命令。在Replace对话框中,选中Regular Expression复选框,并在Find what中输入:%[ ^t]++^p,注意^t之前有空格。该表达式字符含义与EditPlus的相对应。然后,单击Start或Replace All按钮,进行替换删除空行
足球队的比较–绝非侮辱国足![zt]
01、停球
把球停到自己脚下10毫米的后卫,是巴西球员;
把球停到自己脚下10厘米的后卫,是西班牙球员;
把球停到自己脚下10分米的后卫,是德国球员;
把球停到自己脚下100米,并形成射门,迫使对方门将做出扑救的后卫,是中国球员。
2、 传球
能够做出50米外精确长传,找到场上队友的球员,是英国球员;
能够做出5米内精巧二过一的球员,是阿根廷球员;
能够做出5米内短传传丢,并且后卫前锋隔着50米就玩二过一的球员,是中国球员。
3、 射门
能够在30米外劲射破门的球员,是德国球员;
能够通过精妙配合在门前3米打空门得手的球员,是葡萄牙球员;
能够在罚点球时把角旗打翻的球员,是中国球员
4、 带球
能够把球从本方底线带到对方半场的球员,是荷兰球员;
能够把球从本方底线带到对方底线的球员,是巴西球员;
能够把球从本方球员脚下抢断,并带到本方球门里的,是中国球员。
能够把球带得像亨利一样的,是李Y大帝。
5、 球风
能够对裁判鼓掌的球员,是欧洲球员;
能够对裁判说脏话的球员,是南美球员;
能够对裁判吐口水和追打的球员,是中国球员。
6、 踩单车
能够连踩8个单车,得到点球的球员,是巴西球员;
能够连踩3个单车,突入禁区助攻的球员,是葡萄牙球员;
能够连踩半个单车,把自己摔成骨折的球员,是中国球员。
7、 体能
能够狂奔90分钟,面不改色的球员,是韩国球员;
能够奔跑90分钟,气喘吁吁的球员,是欧洲球员;
能够跑动90分钟,汗流浃背的球员,是南美球员;
能够散步90分钟,倒地抽筋的球员,是中国球员。
8、 速度
能够跑得比球快的球员,是荷兰球员;
能够跑得跟球一样快的球员,是英国球员;
能够跑得跟裁判一样快的球员,是马尔代夫球员;
连裁判都跑不过的球员,是中国球员。
9、 态度
把足球当成生命的,是非洲球员;
把足球当成工作的,是欧洲球员;
把足球当成游戏的,是南美球员;
把足球当成儿戏的,是中国球员
中国男足为什么总是输?
一、草皮不适应
1、草皮太硬了
2、草皮太软了
3、不适应阔叶草及其它一些草
二、天气原因
1、下雪
2、下雨
3、下冰雹
4、阳光太好了
5、冷
6、热
7、不冷不热(不能给对手造成麻烦)
三、赛场因素
1、场内因素: A、裁判帮他们 B、裁判不帮我们
C、对手身体太强壮 D、对手技术太细腻
E、门柱帮了他们 F、对方守门员发挥BT+超常
G、补时太短 H、补时太长
2、场外因素: A、客场作战,气氛影响 B、主场作战,干扰太大
C、观众不为我们喝彩 D、有人往场内扔手雷
四、抽签抽得不好
1、同组都是强队踢输了,我拷死亡之组,按惯例当然应该中国队输。
2、同组都是中等水平队踢输了,主要是想赢怕输的思想包袱太重了,队员们没能放
得开手脚。
3、同组都是弱队踢输了,对对手不够重视,麻痹大意,一时疏忽。
五、其他原因(外在)
1、对亚洲强队踢输了,恐X心理在作怪,走不出阴影。
2、对亚洲弱队踢输了,对手进步太大了,太大了,我们对他们没有秘密可言了
都。
3、对欧洲弱队踢输了,中国队输给了欧洲队。
4、对欧洲强队(比如意大利队)0:1踢输了,告诉大家一个好消息:中国队仅
以0:1输给了强大的意大利队!!
5、对欧洲强队(比如意大利队)0:10踢输了,中国队踢出了自已的一惯水平,
队员们也努力了,结果也不出全国人民所料。
6、对欧洲强队(比如意大利队)0:100踢输了,精彩的比赛!意大利某球星进
了20个,某球星进了25个!看来中国队跟意大利队的水平差距确实是有一点的。
六、其他原因(内在球员)
1、“海龟派”没回来踢输了,我们雪藏主力。
2、“海龟派”回来踢输了,时差没倒过来。
七、 其他原因(内在综合)
1、主教练技术差!
2、中国球迷素质差!
3、中国足协这个名字差!
4、中国队——队医技术差!
5、中国足协领导人——办公室里那位倒水扫地的大妈差!
八、没有我们想不到的
草皮不软不硬,天气不冷不凉,裁判和门柱净帮着我们,对方没有守门员,补时时间
长短我们说了算,到第三国去比赛,观众全都为我们猛喝彩,观众全都不往场内扔手雷,
抽了一个人人都说好的签,“海龟派”回来后猛睡了一个月倒回时差参加比赛,换了个主
教练,换了批外国球迷,换了个中国足协——的牌子,换了中国队——的队医,换了个中
国足协领导人——办公室里的打杂大妈,踢输了——
怪天怪地怪裁判怪外教什么都怪就是不怪自己
《星际争霸2》不支持多核心处理器
0Starcraftwire.net近日在一篇多核心处理器研究文章中指出,看起来《星际争霸2》并不能发挥多个处理核心的优势。
虽然双核心现在已经成了绝对主流选择,但在用户中单核心仍然大量存在,而且不要忘了,《星际争霸2》从2003年就投入开发了,而双核心处理器直到2005年才出现,而且刚开始的时候价格奇高,很少有人用得起,直到最近两年才走入寻常百姓家。
很显然,《星际争霸2》最初是面向单核心系统开发的,而如果想对双核心乃至多核心进行优化,必然要对游戏引擎进行大刀阔斧地改动,大大延长开发周期。开发速度本来就不是暴雪的“强项”,再这样大动干戈,玩家就不知道要等到什么时候了。
除了《魔兽世界》对内存要求较高,暴雪的游戏一般都不是硬件杀手,普通配置的玩家也能轻松享受,看起来《星际争霸2》也要延续这一优良传统,这也应该是玩家之福了。
当然,多核心系统仍然是最佳选择。即使不能让你的游戏提速,也会给多任务操作带来很大便利。
读取纯真IP数据库 showip [zt]
0关于 纯真IP数据库格式,详细见下面帖子:
程序说明:能够根据输入的IP,在 纯真IP数据库 中,搜索并且读取对应的 物理地址,还可以导出所有的IP段地址信息
函数部分
[CODE=cplusplus]
#include “stdio.h”
#include “string.h”
#define QQWRY “QQWry.dat”
#define REDIRECT_MODE_1 0×01
#define REDIRECT_MODE_2 0×02
#define MAXBUF 255
/*unsigned long getValue( 获取文件中指定的16进制串的值,并返回
FILE *fp, 指定文件指针
unsigned long start, 指定文件偏移量
int length) 获取的16进制字符个数/长度
*/
unsigned long getValue(FILE *fp, unsigned long start, int length)
{
unsigned long variable=0;
long val[length],i;
fseek(fp,start,SEEK_SET);
for(i=0;i
/*过滤高位,一次读取一个字符*/
val[i]=fgetc(fp)&0x000000FF;
}
for(i=length-1;i>=0;i–)
{
/*因为读取多个16进制字符,叠加*/
variable=variable*0×100+val[i];
}
return variable;
};
/*int getString( 获取文件中指定的字符串,返回字符串长度
FILE *fp, 指定文件指针
unsigned long start, 指定文件偏移量
char **string) 用来存放将读取字符串的字符串空间的首地址
*/
int getString(FILE *fp, unsigned long start, char **string)
{
unsigned long i=0;
char val;
fseek(fp,start,SEEK_SET);
/*读取字符串,直到遇到0×00为止*/
do
{
val=fgetc(fp);
/*依次放入用来存储的字符串空间中*/
*(*string+i)=val;
i++;
}while(val!=0×00);
/*返回字符串长度*/
return i;
};
/*void getAddress( 读取指定IP的国家位置和地域位置
FILE *fp, 指定文件指针
unsigned long start, 指定IP在索引中的文件偏移量
char **country, 用来存放国家位置的字符串空间的首地址
char **location) 用来存放地域位置的字符串空间的首地址
*/
void getAddress(FILE *fp, unsigned long start, char **country, char **location)
{
unsigned long redirect_address,counrty_address,location_address;
char val;
start+=4;
fseek(fp,start,SEEK_SET);
/*读取首地址的值*/
val=(fgetc(fp)&0x000000FF);
if(val==REDIRECT_MODE_1)
{
/*重定向1类型的*/
redirect_address=getValue(fp,start+1,3);
fseek(fp,redirect_address,SEEK_SET);
/*混合类型,重定向1类型进入后遇到重定向2类型
读取重定向后的内容,并设置地域位置的文件偏移量*/
if((fgetc(fp)&0x000000FF)==REDIRECT_MODE_2)
{
counrty_address=getValue(fp,redirect_address+1,3);
location_address=redirect_address+4;
getString(fp,counrty_address,country);
}
/*读取重定向1后的内容,并设置地域位置的文件偏移量*/
else
{
counrty_address=redirect_address;
location_address=redirect_address+getString(fp,counrty_address,country);
}
}
/*重定向2类型的*/
else if(val==REDIRECT_MODE_2)
{
counrty_address=getValue(fp,start+1,3);
location_address=start+4;
getString(fp,counrty_address,country);
}
else
{
counrty_address=start;
location_address=counrty_address+getString(fp,counrty_address,country);
}
/*读取地域位置*/
fseek(fp,location_address,SEEK_SET);
if((fgetc(fp)&0x000000FF)==REDIRECT_MODE_2||(fgetc(fp)&0x000000FF)==REDIRECT_MODE_1)
{
location_address=getValue(fp,location_address+1,3);
}
getString(fp,location_address,location);
return;
};
/*void getHead( 读取索引部分的范围(在文件头中,最先的2个8位16进制)
FILE *fp, 指定文件指针
unsigned long *start, 文件偏移量,索引的起止位置
unsigned long *end) 文件偏移量,索引的结束位置
*/
void getHead(FILE *fp,unsigned long *start,unsigned long *end)
{
/*索引的起止位置的文件偏移量,存储在文件头中的前8个16进制中
设置偏移量为0,读取4个字符*/
*start=getValue(fp,0L,4);
/*索引的结束位置的文件偏移量,存储在文件头中的第8个到第15个的16进制中
设置偏移量为4个字符,再读取4个字符*/
*end=getValue(fp,4L,4);
};
/*unsigned long searchIP( 搜索指定IP在索引区的位置,采用二分查找法;
返回IP在索引区域的文件偏移量
一条索引记录的结果是,前4个16进制表示起始IP地址
后面3个16进制,表示该起始IP在IP信息段中的位置,文件偏移量
FILE *fp,
unsigned long index_start, 索引起始位置的文件偏移量
unsigned long index_end, 索引结束位置的文件偏移量
unsigned long ip) 关键字,要索引的IP
*/
unsigned long searchIP(FILE *fp, unsigned long index_start,
unsigned long index_end, unsigned long ip)
{
unsigned long index_current,index_top,index_bottom;
unsigned long record;
index_bottom=index_start;
index_top=index_end;
/*此处的7,是因为一条索引记录的长度是7*/
index_current=((index_top-index_bottom)/7/2)*7+index_bottom;
/*二分查找法*/
do{
record=getValue(fp,index_current,4);
if(record>ip)
{
index_top=index_current;
index_current=((index_top-index_bottom)/14)*7+index_bottom;
}
else
{
index_bottom=index_current;
index_current=((index_top-index_bottom)/14)*7+index_bottom;
}
}while(index_bottom
return index_current;
};
/*unsigned long putAll( 导出所有IP信息到文件文件中,函数返回导出总条数
FILE *fp,
FILE *out, 导出的文件指针,必须拥有写权限
unsigned long index_start, 索引区域的起始文件偏移量
unsigned long index_end) 索引区域的结束文件偏移量
*/
unsigned long putAll(FILE *fp, FILE *out, unsigned long index_start, unsigned long index_end)
{
unsigned long i,count=0;
unsigned long start_ip,end_ip;
char *country;
char *location;
country=(char*)malloc(255);
location=(char*)malloc(255);
/*此处的7,是因为一条索引记录的长度是7*/
for(i=index_start;i
/*获取IP段的起始IP和结束IP,
起始IP为索引部分的前4位16进制
结束IP在IP信息部分的前4位16进制中,靠索引部分指定的偏移量找寻*/
start_ip=getValue(fp,i,4);
end_ip=getValue(fp,getValue(fp,i+4,3),4);
/*导出IP信息,格式是
起始IPt结束IPt国家位置t地域位置n*/
fprintf(out,”%d.%d.%d.%d”,(start_ip&0xFF000000)>>0×18,
(start_ip&0x00FF0000)>>0×10,(start_ip&0x0000FF00)>>0×8,start_ip&0x000000FF);
fprintf(out,”t”);
fprintf(out,”%d.%d.%d.%d”,(end_ip&0xFF000000)>>0×18,
(end_ip&0x00FF0000)>>0×10,(end_ip&0x0000FF00)>>0×8,end_ip&0x000000FF);
getAddress(fp,getValue(fp,i+4,3),&country,&location);
fprintf(out,”t%st%sn”,country,location);
count++;
}
/*返回导出总条数*/
return count;
};
/*判断一个字符是否为数字字符,
如果是,返回0
如果不是,返回1*/
int beNumber(char c)
{
if(c>=’0′&&c< ='9')
return 0;
else
return 1;
};
/*函数的参数是一个存储着IP地址的字符串首地址
返回该IP的16进制代码
如果输入的IP地址有错误,函数将返回0*/
unsigned long getIP(char *ip_addr)
{
unsigned long ip=0;
int i,j=0;
/*依次读取字符串中的各个字符*/
for(i=0;i
/*如果是IP地址间隔的‘.’符号
把当前读取到的IP字段的值,存入ip变量中
(注意,ip为叠加时,乘以16进制的0×100)
并清除临时变量的值*/
if(*(ip_addr+i)==’.')
{
ip=ip*0×100+j;
j=0;
}
/*往临时变量中写入当前读取到的IP字段中的字符值
叠加乘以10,因为输入的IP地址是10进制*/
else
{
/*判断,如果输入的IP地址不规范,不是10进制字符
函数将返回0*/
if(beNumber(*(ip_addr+i))==0)
j=j*10+*(ip_addr+i)-’0′;
else
return 0;
}
}
/*IP字段有4个,但是‘.’只有3个,叠加第四个字段值*/
ip=ip*0×100+j;
return ip;
};
/*显示logo信息*/
void logo(void)
{
printf(“=============================================================================n”);
printf(“— Get the IP info.s from QQWry.dat v0.1 by dorainm dorainm@gmail.com —n”);
printf(“=============================================================================n”);
};
/*显示程序语法*/
void usage(char *app_name)
{
printf(“nUsage : %s [options]n”,app_name);
printf(“options:n”);
printf(” -a
printf(” -i
printf(” -o
printf(” -local Display the localhost IP’s informations.(*)n”);
printf(” -updata Update the QQWry.dat from the Internet.(*)nn”);
printf(“ps: the optionss marked (*) are incompleted.n”);
};
/*显示结束信息*/
void showend(void)
{
printf(“nnThe command completed successfully.nn”);
};
[/CODE]
main函数部分
[CODE=cplusplus]
/*主函数*/
int main(int argc, char *argv[])
{
FILE *fp; /*打开QQWry.dat的文件指针*/
unsigned long index_start,index_end,current; /*索引部分的起始位置的文件偏移量
索引部分的结束位置的文件偏移量
待搜索IP地址的索引条目的文件偏移量*/
char *country; /*国家位置*/
char *location; /*地域位置*/
country=(char*)malloc(MAXBUF);
location=(char*)malloc(MAXBUF);
logo();
if(argc<3)
{
usage(argv[0]);
showend();
return 1;
}
/*打开QQWry.dat文件*/
if((fp=fopen(QQWRY,”rb”))==NULL)
{
printf(“[-] Error : Can not open the file %s.n”,QQWRY);
showend();
return 2;
}
else
printf(“[+] Open the file [ %s ] successfully.n”,QQWRY);
/*显示QQWry.dat文件信息*/
getHead(fp,&index_start,&index_end);
getAddress(fp,getValue(fp,index_end+4,3),&country,&location);
printf(“[+] Version of QQWry.dat : [ %s %s ]n”,country,location);
printf(“[+] Index Location [ 0x%X - 0x%X ].n”,index_start,index_end);
/*判断第一个参数的值*/
if((strncmp(argv[1],”-i”,2)==0)||(strncmp(argv[1],”-I”,2)==0))
{
/*-i参数,搜索IP*/
unsigned long ip;
ip=getIP(argv[2]);
if(ip==0)
{
printf(“[-] Error : the IP Address inputed.n”);
showend();
return 3;
}
/*搜索IP在索引区域的条目的偏移量*/
current=searchIP(fp,index_start,index_end,ip);
printf(“[+] Address of index for [ %X ] is %Xn”,ip,current);
/*获取该IP对因的国家地址和地域地址*/
getAddress(fp,getValue(fp,current+4,3),&country,&location);
printf(“[+] Get the location for the IP address.n”);
printf(“[+] [ IP Address ] %d.%d.%d.%dn”,(ip&0xFF000000)>>0×18,(ip&0x00FF0000)>>0×10,(ip&0x0000FF00)>>0×8,ip&0x000000FF);
printf(“[+] [ Location ] %s %sn”,country,location);
}
else if((strncmp(argv[1],”-o”,2)==0)||(strncmp(argv[1],”-O”,2)==0))
{
/*-o参数,解压缩数据库,导出IP信息到文本文件*/
FILE *out;
unsigned long num;
if((out=fopen(argv[2],”w”))==NULL)
{
printf(“[-] Error create the output text file [ %s ].n”,”out.txt”);
showend();
}
else
{
printf(“[+] Create the output text file [ %s ] successfully.n”,”out.txt”);
}
/*导出IP条目信息*/
printf(“[+] Outputing the informations …”);
num=putAll(fp,out,index_start,index_end);
printf(“Finished.n”);
fclose(out);
/*显示导出条目的数量*/
printf(“[+] The Total items number is [ %d ].”,num);
}
/*关闭文件指针,释放变量空间,结束程序*/
fclose(fp);
free(country);
free(location);
showend();
return 0;
}
[/CODE]
使用语法:
==============
============================================
--- Get the IP info.s from QQWry.dat v0.1 by dorainm dorainm@gmail.com ---
==========================================================
Usage : showip [options]
options:
-a <address> Search and display the Informations by Location Address.(*)
-i <IP> Search and display the Informations by IP Address.
-o <FILE> Output all the informations to a text file.
-local Display the localhost IP's informations.(*)
-updata Update the QQWry.dat from the Internet.(*)
ps: the optionss marked (*) are incompleted.
The command completed successfully.
搜索IP:
showip -i 222.19.211.254
==========================================================
--- Get the IP info.s from QQWry.dat v0.1 by dorainm dorainm@gmail.com ---
==========================================================
[+] Open the file [ QQWry.dat ] successfully.
[+] Version of QQWry.dat : [ 纯真网络 2006年3月5日IP数据 ]
[+] Index Location [ 0x37A265 - 0x535EB1 ].
[+] Address of index for [ DE13D3FE ] is 51BB44
[+] Get the location for the IP address.
[+] [ IP Address ] 222.19.211.254
[+] [ Location ] 云南大学 国家示范性软件学院
The command completed successfully.
导出所有IP信息,语法是 showip -o out.txt
其余功能有待完成
程序在 gcc3.3.1 中编译通过
如果移植到 microsoft windows 下,使用 VC 编译器,
可能需要把main函数中所有的变量申明语句移动到main函数的 logo(); 语句前面
(遥远记得以前,我在win2000下用VC++6.0,好像需要先申请再执行语句
不然编译没法通过…)
注:使用malloc要包含必要的头文件stdlib.h,在gcc4下编译出现warning: incompatible implicit declaration of built-in function ‘malloc’