JavaScript获取IP获取的是IPV6 如何校验

1、什么是IPV6?

  这个问题可以去百度或Google找一下,应该会有很大的收获,其实主要就是为了解决IPV4地址不够用的问题,V4地址是32位,即:192.168.1.1,而V6地址则是128位,比V4扩大了太多倍。

2、IPV6有子网掩码吗?

  可以说有,也可以说没有,说有呢,是因为在IPV6中有前缀的说法,它相当于IPV4中的子网掩码,只是名称不相同了;说没有呢,也可以,因为IPV6的地址实在是太大了,号称可以给地球上每个沙子一个地址,这样就淡化了子网的概念,不需要了。

3、IPV6的地址

  IPV6地址写法在网上也可以查到很多很多,我就不详细列了,一般如下:1205::fff0:ffd1:1021/120,后面的120就是代表了前缀,相当于IPV4中的子网掩码。

4、IP地址的计算方式

  IPV6和IPV4的网段计算方式一样,对于IPV4而言,如192.168.1.1/255.255.255.0,那么它的网段是从192.168.1.0~192.168.1.255,这个是怎么计算出来的呢?根据ISP的规定,它的起始地址为:此IP地址和子网掩码按位与运算求得;它的终止地址为:此IP地址和子网掩码的取反(不包含符号位)按位或运算求得。

  IPV6也和IPV4在原理上是一样的,因为IPV6前缀太长了,所以根本无法用255.255.255.0的形式表达出来,因此通常直接写数字,如120或128等。120代表此前缀的前120位都是1,后面的则是0,这个前缀就相当于IPV4中的子网掩码,计算IPV6地址和IPV4一样。

上面已经将IPV6的简要知识说明了一下,下面来处理下IPV6网址。

IPV6的网址写法上需要兼容零压缩法,因此需要对IPV6的网址进行转换,下面是JS的转换代码

rush:js;"> function transitIp(ipaddr)//将IPV6地址补全 { var ipaddress = ipaddr.split("/"); var ipaddrs = ipaddress[0].split(":"); if(ipaddrs.length<8) { var count = 0; for(var i=0;i内容放置于ipaddrs中,但不标准 return initaddr(ipaddrs);//获得了ip地址的完整字符串 } function addZero(num) { var zerostr = ""; for(var i=1;iarat(iparray.length-1)==':') { iparray = iparray.substr(0,iparray.length-1); } //var iparrays = iparray.split(":"); //return iparrays; return iparray; }

IPV6地址判断的正则表达式为:

rush:js;"> function isIPv6(str)//IPV6地址判断 { return /:/.test(str) &&str.match(/:/g).length<8 &&/::/.test(str) ?(str.match(/::/g).length==1 &&/^::$|^(::)?([\da-f]{1,4}(:|::))*[\da-f]{1,4}(:|::)?$/i.test(str)) :/^([\da-f]{1,4}:){7}[\da-f]{1,4}$/i.test(str); }

接着我们说明下IPV4到IPV6的转换:

IPV4到IPV6网址的转换很简单,只需将IPV4地址转为十六进制格式,以两段为一组,然后再前面添加::ffff即可

JS代码如下:

rush:js;"> function four2six(fouraddr,fourmask)//IPV4转IPV6,包括地址和掩码 { var reg = fouraddr.match(/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/); if(reg==null) { alert("IP地址不正确!"); return; } if(fourmask.indexOf(".")!=-1) { reg = fourmask.match(/^(254|252|248|240|224|192|128|0)\.0\.0\.0$|^(255\.(254|252|248|240|224|192|128|0)\.0\.0)$|^(255\.255\.(254|252|248|240|224|192|128|0)\.0)$|^(255\.255\.255\.(255|254|252|248|240|224|192|128|0))$/); if(reg==null) { alert("子网掩码不正确!"); return; } } else { var mask = parseInt(fourmask,10); if(mask<0 || mask > 32) { alert("子网掩码不正确!"); return; } } /*** IPV4转IPV6的方法很简单 1、先将其每段转为16进制 2、不足两位的前面添加0 3、V4一共会产生4个16进制数字,比前两个和后两个分别组合 4、地址前面加上"0000:0000:0000:0000:0000:ffff:"即可 **/ var sixtemp = ""; var fouraddrs = fouraddr.split("."); for (var i=0; iarat(j)=='0') { flagtemp = true; masktemp += i*8 + j; break; } if(j==7&&i==3) { flagtemp = true; masktemp = 128; break; } } if(flagtemp) { break; } } } return sixtemp + "/" + masktemp; } function four2sixip(fouraddr)//IPV4转IPV6,只转地址 { var reg = fouraddr.match(/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/); if(reg==null) { alert("IP地址不正确!"); return; } var sixtemp = ""; var fouraddrs = fouraddr.split("."); for (var i=0; i

当然在上面的方法中包含了,对IPV4地址和掩码的正则判断,支持掩码以255.255.255.0的形式以及/32的形式两种。

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...