判断IPV6地址格式是否正确

1.判断IPV6地址格式是否正确


此功能代码实现判断IPV6地址是否正确,正确返回1,错误误返回0。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值