1.判断IPV6地址格式是否正确
#define H(x) ((unsigned char *) & (x) )[0] #define L(x) ((unsigned char *) & (x) )[1] //char * abbr, ipv6字符串 //unsigned char * ret_buff,返回和引用的buff //return 传入buff的指针 int CGlobalLogic::ipv6_to_u (char * abbr,unsigned char * ret_buff) { char buff[40]={0}; int ipv6_int[8]={0}; int two_colon = -1; int ipv6_char_len = strlen(abbr); assert(abbr!=NULL && ret_buff!=NULL); //查找是否有缩写的情况 // two_colon=abbr.find_first_of("::"); if((ipv6_char_len<3 ) ||(abbr[0] ==':' && abbr[1]!=':') ||(abbr[ipv6_char_len-1]==':' && abbr[ipv6_char_len-2]!=':' )) { printf("Invalid ipv6 addr[%s]!",abbr); return 0; } for (int i=0;i<ipv6_char_len;i++) { if (!((abbr[i]>='0'&&abbr[i]<='9')||(abbr[i]>='a'&&abbr[i]<='f')||(abbr[i]>='A'&&abbr[i]<='F')||abbr[i] == ':')) { printf("Invalid ipv6 addr[%s]!",abbr); return 0; } } for(int i=0,j=0;i<ipv6_char_len;i++) { if(abbr[i]!=':') { j++; } else { j=0; } if(abbr[i] == ':' && abbr[i+1] == ':') { if(two_colon == -1) { two_colon =i; } else { printf("Invalid ipv6 addr[%s],:: appears once!",abbr); return 0; } } if(j>4) { printf("Invalid ipv6 addr[%s], every 2Bytes not more than 4 chars!",abbr); return 0; } } //处理缩写的情况. if(two_colon>=0) { int pos = 0; int start_colon_num = 0; int end_colon_num = 0; int add_colon_num = 0; //找:: 前面:的个数 for(int i=0;i<two_colon;i++) { if(abbr[i] == ':' ) { start_colon_num ++; } } //找:: 后面:的个数 for(int i=two_colon+2;i<ipv6_char_len;i++) { if(abbr[i] == ':' ) { end_colon_num ++; } } //计算需要添加 "0:" 的个数,总共只有7个冒号. add_colon_num = 7 - start_colon_num - end_colon_num ; for(pos =0;pos <two_colon;pos ++) { buff[pos] = abbr[pos]; } while(add_colon_num>0) { buff[pos++] =':'; add_colon_num --; if(add_colon_num!=0) buff[pos++] ='0'; } for(int i=two_colon+2; i<ipv6_char_len; ) { buff[pos++] = abbr[i++]; } buff[pos] = ' '; }//end else //标准格式 { if(two_colon == -1) { strncpy(buff,abbr,ipv6_char_len); } } // printf("%s",buff); int colon_num = sscanf (buff,"%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x", &ipv6_int[0],&ipv6_int[1],&ipv6_int[2],&ipv6_int[3], &ipv6_int[4],&ipv6_int[5],&ipv6_int[6],&ipv6_int[7]); if(colon_num<=0 || (two_colon==-1 && colon_num !=8 )) { printf("Invalid ipv6 addr [%s] format!",abbr); return 0 ; } #if 0 printf("colon_num:%d,two_colon:%d",colon_num,two_colon); for(int k=0;k<8;k++) { printf("%3d,",ipv6_int[k]); } #endif //获取标准化后的值 for(int i=0;i<8;i++) { ret_buff[i*2] = L(ipv6_int[i]); ret_buff[i*2+1] = H(ipv6_int[i]); } return 1; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233052.html原文链接:https://javaforall.net