现在的位置: 首页 > 综合 > 正文

BIT-MAP的简单实现

2012年10月06日 ⁄ 综合 ⁄ 共 2396字 ⁄ 字号 评论关闭

主要是参考guisu同学的代码 确实很漂亮~

我是显得主要功能是把txt中存在的IP地址在MAP中的比特位置1,从而方便后续的判断,判断是否出现过IP字段,其中上篇文中自己津津乐道的strtok()竟然被淘汰了啊,我都不知道,这里换成了strseq(char ** , char *),这里使用的时候注意char**指向的内容会在进行strseq()发生变化,另外之前使用了个while((p=strseq())!=NULL)循环,各种出错呀,first thing first原则,多码了两行代码没用循环,惭愧...需要好好补补C指针这方面的东西了~

还是很开心的一天~CSDN果然比百度空间显示代码显示的好的多~

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1f
#define N "255.255.255.0"
#define MAXREADLINE 100

void 
set(int *a, int i){
	a[i>>SHIFT] |= (1<<(i & MASK));
}

void
clr(int *a, int i){
	a[i>>SHIFT] &= ~(1<<(i & MASK));
}

int test(int *a, int i){
	if((a[i>>SHIFT] & (1<<(i & MASK))) == 0)
		return 0;
	return 1;
}

unsigned int 
ip_to_serialnum(char *netaddr){
	char netaddr_copy[32];
	char *netaddr_copy_ptr, *p;
	unsigned int i, ip_serialnum;
	memset(netaddr_copy, 0, 32);
	for(i=0; i<32; i++){
		netaddr_copy[i] = netaddr[i];
	}
	netaddr_copy_ptr = netaddr_copy;
	while((p = strsep(&netaddr_copy_ptr, ".")) != NULL){
		printf("p = %s\n", p);
		ip_serialnum = ip_serialnum << 8;
		ip_serialnum += atoi(p);
	}
	printf("ip_serialnum = 0x%x\n", ip_serialnum);
	return ip_serialnum;
}

void
bmap_initial(){
	unsigned int map_len = ip_to_serialnum(N);
	map_len = map_len >> 8;
	printf("map_len = %d\n",map_len);
	FILE *fp = fopen("CNIP.txt", "r");
	char readline[MAXREADLINE];
	char *readline_ptr, *p;
	unsigned int ip_serialnum, ip_seg_num, i;
	int bmap[1 + map_len/BITSPERWORD];
	printf("bmap_len = %d\n", 1+map_len/BITSPERWORD);
	while(fgets(readline, MAXREADLINE, fp) != NULL){
		printf("readline = %s\n", readline);
		readline_ptr = readline;
		p = strsep(&readline_ptr, "|");
		printf("p = %s\n", p);
		ip_serialnum = ip_to_serialnum(p);
		ip_serialnum = ip_serialnum >> 8;
		printf("ip_serialnum = 0x%x\n", ip_serialnum);
		p = strsep(&readline_ptr, "|");    //here used to realized with "while"
		ip_seg_num = atoi(p);
		ip_seg_num /= 256;
		printf("p = %s\n", p);
		for(i=ip_serialnum; i<ip_serialnum+ip_seg_num; i++){
			set(bmap, i);
		}
	}
	printf("test the result\n");
	char ip1[] = "202.9.58.255";
	unsigned int ip1_serialnum = ip_to_serialnum(ip1);
	ip1_serialnum = ip1_serialnum >> 8;
	printf("ip1 = %d\n", test(bmap, ip1_serialnum));
	char ip2[] = "202.13.255.255";
	unsigned int ip2_serialnum = ip_to_serialnum(ip2);
	ip2_serialnum = ip2_serialnum >> 8;
	printf("ip2 = %d\n", test(bmap, ip2_serialnum));
	char ip3[] = "223.2.33.255";
	unsigned int ip3_serialnum = ip_to_serialnum(ip3);
	ip3_serialnum = ip3_serialnum >> 8;
	printf("ip3 = %d\n", test(bmap, ip3_serialnum));
	char ip4[] = "224.0.0.0";
	unsigned int ip4_serialnum = ip_to_serialnum(ip4);
	ip4_serialnum = ip4_serialnum >> 8;
	printf("ip4 = %d\n", test(bmap, ip4_serialnum));

}
	
	
int main(){
	printf("main\n");
	bmap_initial();
	return 0;
}

抱歉!评论已关闭.