判断IPV6地址格式是否正确

判断IPV6地址格式是否正确1 判断 IPV6 格式字串是否正确此功能代码实现判断 IPV6 地址是否正确 正确返回 1 错误误返回 0 defineH x unsignedchar amp x 0 defineL x unsignedchar amp x 1 char abbr ipv6 字符串 unsignedchar ret buf

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233052.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Idea导入jar包的两种方法

    Idea导入jar包的两种方法今天用IDEA,需要导入一个Jar包,因为以前都是用eclipse的,所以对这个idea还不怎么上手,连打个Jar包都是谷歌了一下。但是发现网上谷歌到的做法一般都是去File–&gt;ProjectStructure中去设置,有没有如同eclipse一样简便的右键添加方法呢。然后自己摸索了一下,找到了。以阿里大于的依赖包为例子,因为正好是我遇到要导入的Jar包。先说下第一种方法吧。也就是Fi…

    2022年6月22日
    55
  • Java别说取余(%)运算简单,你真的会吗?

    Java别说取余(%)运算简单,你真的会吗?一,直击现场下面我来抛出几道题:说明m是商,n是余数;(1)正数%正数3%2=m…….n2%3=m…….n(2)正数%负数或者负数%正数-3%2=m…….n3%-2=m…….n-2%3=m…….n2%-3=m…….n(3)负数%负数-3%-2=m…….n-2%-3=m…….n二,验证时刻下面的结果没有商m只有余数n;有没有全部答对呢?没有的话来看总结吧

    2022年5月7日
    41
  • 交叉熵代价函数详解

    交叉熵代价函数详解大多数人都会对犯错感到不愉快。在我刚学钢琴不久时,我将要在观众面前进行我的第一场表演。我当时很紧张,把一个八度弹奏低了。我卡住了,直到别人指出我的错误后,我才得以继续弹奏。我当时非常尴尬。尽管犯错时很不愉快,但是我们能够从明显的错误中学到东西。你能猜到在我下次弹奏的时候会把这个八度弹对。相反,如果错误很不明显的话,我们的学习速度将会很慢。理想情况下,我们希望神经网络能够快速地从错误中学习。这种…

    2022年6月5日
    35
  • 虚地址转化为内存地址_转换法与转化法

    虚地址转化为内存地址_转换法与转化法页式地址变换虚地址结构虚地址是用户程序中的逻辑地址,它包括页号和页内地址(页内位移)区分页号和页内地址的依据是页的大小,页内地址占虚地址的低位部分,页号占虚地址的高位部分。假设页面大小为1024字节,虚地址占用2个字节(16位)虚地址转换为内存地址计算如果,虚地址(逻辑地址、程序地址)以十六进制、八进制、二进制的形式给出第一步,将虚地址转换成二进制的数;第二步,按页的大…

    2025年7月12日
    3
  • 基于JAVA+Servlet+JSP+MYSQL的图书销售管理系统

    基于JAVA+Servlet+JSP+MYSQL的图书销售管理系统项目功能:此网上书店系统具有以下基本功能:1.用户注册功能:进入网上书店的用户可以进行商品浏览,但不能进行购买,此时用户的身份为游客。如需购买图书,就要用到用户注册功能。需要输入用户名和密码进行注册。如果已注册的用户忘记密码,可以点击“找回密码”按钮。已注册用户也可以点击“注销”按钮进行用户信息注销。2.商品管理功能:商品管理功能即用户可以对网上书店的书籍进行搜索、查看、选购。在管理员方面,此功能还包括系统内图书的上新、下架管理。3.书店购物车功能:用户可以将心仪的图书加入到书店购物车中。在书店购物

    2022年5月18日
    45
  • Tensorflow数据读取之tfrecord

    Tensorflow数据读取之tfrecord文章目录tfrecordtfrecord的使用流程写入tfrecord文件读取tfrecord文件tfrecord中的数据格式tfrecord中对于变长数据和定长数据的处理tfrecord中生成batch_data的方法插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数…

    2025年6月11日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号