JavaScript擷取IP擷取的是IPV6 如何校正_javascript技巧

來源:互聯網
上載者:User

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的轉碼:

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.length;i++) { if(ipaddrs[i]=="") { if(count==1) {  ipaddrs[i] = addZero(4);  continue; } ipaddrs[i] = addZero((9-ipaddrs.length)*4); count++; } else { ipaddrs[i] += ":"; } } } else if(ipaddrs.length==8) { for(var i=0;i<8;i++) { ipaddrs[i] += ":"; } } ////上述補齊完成,將內容放置於ipaddrs中,但不標準 return initaddr(ipaddrs);//獲得了ip地址的完整字串}function addZero(num){ var zerostr = ""; for(var i=1;i<num+1;i++) { zerostr+="0"; if(i%4==0) { zerostr+=":"; } } return zerostr;}function initaddr(ipaddrs){ var iparray =""; for(var i=0;i<ipaddrs.length;i++) { iparray+=ipaddrs[i]; } if(iparray.charAt(iparray.length-1)==':') { iparray = iparray.substr(0,iparray.length-1); } //var iparrays = iparray.split(":"); //return iparrays; return iparray;}

IPV6地址判斷的Regex為:

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代碼如下:

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])\.(\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; i<fouraddrs.length; i++) { var addr4ip = parseInt(fouraddrs[i], 10); var addrtemp = addr4ip.toString(16); if(addrtemp.length==1) { addrtemp = "0" + addrtemp; } sixtemp += addrtemp; if(i==1) { sixtemp += ":"; } } //以上產生V6位址區段正確 sixtemp = "0000:0000:0000:0000:0000:ffff:" + sixtemp; /*** 下面處理子網路遮罩,子網路遮罩可以有兩種寫法,數字或者255.255.255.0寫法 1、第一種處理比較簡單,只需此數值加96(128-32)即可 2、第二種需要分為四段,每段轉為2進位,看哪一位最開始變為0 **/ var masktemp = 96; if(fourmask.indexOf(".")==-1) { masktemp += parseInt(fourmask); } else { var masks = fourmask.split("."); for ( var i=0; i<masks.length; i++) { var mask4ip = parseInt(masks[i], 10); var mask4temp = mask4ip.toString(2); if(mask4temp.length!=8) { for(var j=0;j<8-mask4temp;j++) {  mask4temp = "0"+mask4temp; } } //下面判斷位置 var flagtemp = false; for(var j=0;j<8;j++) { if(mask4temp.charAt(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])\.(\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])\.(\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<fouraddrs.length; i++) { var addr4ip = parseInt(fouraddrs[i], 10); var addrtemp = addr4ip.toString(16); if(addrtemp.length==1) { addrtemp = "0" + addrtemp; } sixtemp += addrtemp; if(i==1) { sixtemp += ":"; } } //以上產生V6位址區段正確 sixtemp = "0000:0000:0000:0000:0000:ffff:" + sixtemp; return sixtemp;}

當然在上面的方法中包含了,對IPV4地址和掩碼的正則判斷,支援掩碼以255.255.255.0的形式以及/32的形式兩種。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.