摘要:問題求兩個地址之間的個數(shù),例如,之間的個數(shù)算法地址轉(zhuǎn)換成數(shù)字?jǐn)?shù)字轉(zhuǎn)換成地址地址轉(zhuǎn)換成數(shù)字?jǐn)?shù)字轉(zhuǎn)換成地址查找兩個地址之間的原理無論是還是,它們其實都是對應(yīng)整數(shù)值,但是為了方面人的理解和分析,對這個整數(shù)采用了某種格式化的方式進(jìn)行
問題
求兩個IP地址之間的IP個數(shù),例如192.18.16.1~192.18.16.5,2001:DB8:0000:0023:0008:0800:200C:417C~2001:DB8:0:23:8:800:200C:417D之間的IP個數(shù)?
算法import java.math.BigInteger; import java.util.ArrayList; import java.util.List; public class IPCount { /** * IPv4地址轉(zhuǎn)換成數(shù)字 * @param ip */ public long ipv4ToNumber(String ip) { long rs = 0; if (ip == null || ip.isEmpty()) { return rs; } String[] ips = ip.split("."); for (int i = 0; i < ips.length; i++) { rs += Integer.parseInt(ips[i]) * Math.pow(256, (3 - i)); } return rs; } /** * 數(shù)字轉(zhuǎn)換成IPv4地址 * @param number * @return */ public String numberToIpv4(long number) { String ip = ""; List原理ips = new ArrayList (); for (int i = 0; i < 8; i++) { ips.add(String.valueOf(number % 256)); number = number >> 8; } for (int i = ips.size() - 1; i >= 0; i--) { ip = ip.concat(ips.get(i)); if (i > 0) { ip = ip.concat("."); } } return ip; } /** * IPv6地址轉(zhuǎn)換成數(shù)字 * @param ip * @return */ public BigInteger ipv6ToNumber(String ip) { String[] ips = ip.split(":"); BigInteger rs = new BigInteger("0"); for (int i = 0; i < ips.length; i++) { BigInteger a = BigInteger.valueOf(Integer.parseInt(ips[i], 16)); BigInteger b = BigInteger.valueOf(65536).pow(7 - i); BigInteger c = a.multiply(b); rs = rs.add(c); } return rs; } /** * 數(shù)字轉(zhuǎn)換成IPV6地址 * @param number * @return */ public String numberToIpv6(BigInteger number) { String ip = ""; List ips = new ArrayList (); for (int i = 0; i < 8; i++) { ips.add(Integer.toHexString(number.divideAndRemainder(BigInteger.valueOf(65536))[1].intValue())); number = number.shiftRight(16); } for (int i = ips.size() - 1; i >= 0; i--) { ip = ip.concat(ips.get(i)); if (i > 0) { ip = ip.concat(":"); } } return ip; } /** * 查找兩個IP地址之間的IP * @param startIp * @param endIp * @return */ public List findIPs(String startIp, String endIp) { BigInteger startNumber = this.ipv6ToNumber(startIp); BigInteger endNumber = this.ipv6ToNumber(endIp).add(BigInteger.valueOf(1)); List ips = new ArrayList (); while (startNumber.compareTo(endNumber) < 0) { ips.add(this.numberToIpv6(startNumber)); startNumber = startNumber.add(BigInteger.valueOf(1)); } return ips; } }
無論是IPV4還是IPV6,它們其實都是對應(yīng)整數(shù)值,但是為了方面人的理解和分析,對這個整數(shù)采用了某種格式化的方式進(jìn)行表示,比如IPV4是一個32的整數(shù),采用點分十進(jìn)制的格式表示,IPV6是一個128位的整數(shù),采用冒分十六進(jìn)制的個數(shù)表示,也就是說對于一個給定的32位整數(shù),可以轉(zhuǎn)換成一個IP地址,同樣,對于一個給定的IP地址,可以轉(zhuǎn)換成一個32位的整數(shù),所以計算兩個IP地址之間的個數(shù)或者IP,其實就是計算兩個整數(shù)之間有多少個整數(shù)
只是IPV6對應(yīng)一個128位的整數(shù),所以使用Java基本的數(shù)據(jù)類型long是無法存儲這么多位的數(shù)據(jù)的,需要采用了BigInteger
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73292.html
摘要:需求項目有一個保存實時抓拍圖片的功能需要統(tǒng)計攝像頭下每個時間點比如一分鐘保存的圖片個數(shù)并通過線型圖顯示到頁面上這很類似股票的分時線圖的功能所以我參考了一些網(wǎng)上的文章采用來實現(xiàn)這個功能先交代一下項目里數(shù)據(jù)的一個情況攝像頭個數(shù)在個左右單個攝像頭 需求: 項目有一個保存實時抓拍圖片的功能,需要統(tǒng)計攝像頭下每個時間點(比如一分鐘)保存的圖片個數(shù),并通過線型圖顯示到頁面上.這很類似股票的分時K...
摘要:小安分析的數(shù)據(jù)主要是用戶使用代理訪問日志記錄信息,要分析的原始數(shù)據(jù)以的形式存儲。下面小安帶小伙伴們一起來管窺管窺這些數(shù)據(jù)。在此小安一定一定要告訴你,小安每次做數(shù)據(jù)分析時必定使用的方法方法。 隨著網(wǎng)絡(luò)安全信息數(shù)據(jù)大規(guī)模的增長,應(yīng)用數(shù)據(jù)分析技術(shù)進(jìn)行網(wǎng)絡(luò)安全分析成為業(yè)界研究熱點,小安在這次小講堂中帶大家用Python工具對風(fēng)險數(shù)據(jù)作簡單分析,主要是分析蜜罐日志數(shù)據(jù),來看看一般大家都使用代理i...
摘要:因為本人在成都從事前端,所以這次爬取的關(guān)鍵詞既是成都,前端。僅僅有這個是不夠的,因為貌似拉勾網(wǎng)有反爬蟲,沒有好像得不到數(shù)據(jù)這個還待論證,至少我這邊是。 前言 showImg(https://segmentfault.com/img/bV1g4S?w=700&h=490); 今天是2018的第一天,首先祝各位小伙伴元旦快樂!又到了新的一年,雖然離春節(jié)還有一段時間,但是程序狗打工不易啊,不...
摘要:因為本人在成都從事前端,所以這次爬取的關(guān)鍵詞既是成都,前端。僅僅有這個是不夠的,因為貌似拉勾網(wǎng)有反爬蟲,沒有好像得不到數(shù)據(jù)這個還待論證,至少我這邊是。 前言 showImg(https://segmentfault.com/img/bV1g4S?w=700&h=490); 今天是2018的第一天,首先祝各位小伙伴元旦快樂!又到了新的一年,雖然離春節(jié)還有一段時間,但是程序狗打工不易啊,不...
閱讀 3400·2021-09-22 15:17
閱讀 2751·2021-09-02 15:15
閱讀 1779·2019-08-30 15:54
閱讀 2009·2019-08-30 14:02
閱讀 2536·2019-08-29 16:58
閱讀 2998·2019-08-29 16:08
閱讀 1339·2019-08-26 12:24
閱讀 1662·2019-08-26 10:41