主要是参考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; }