摘要:問題求兩個地址之間的個數,例如,之間的個數算法地址轉換成數字數字轉換成地址地址轉換成數字數字轉換成地址查找兩個地址之間的原理無論是還是,它們其實都是對應整數值,但是為了方面人的理解和分析,對這個整數采用了某種格式化的方式進行
問題
求兩個IP地址之間的IP個數,例如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個數?
算法import java.math.BigInteger; import java.util.ArrayList; import java.util.List; public class IPCount { /** * IPv4地址轉換成數字 * @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; } /** * 數字轉換成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地址轉換成數字 * @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; } /** * 數字轉換成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,它們其實都是對應整數值,但是為了方面人的理解和分析,對這個整數采用了某種格式化的方式進行表示,比如IPV4是一個32的整數,采用點分十進制的格式表示,IPV6是一個128位的整數,采用冒分十六進制的個數表示,也就是說對于一個給定的32位整數,可以轉換成一個IP地址,同樣,對于一個給定的IP地址,可以轉換成一個32位的整數,所以計算兩個IP地址之間的個數或者IP,其實就是計算兩個整數之間有多少個整數
只是IPV6對應一個128位的整數,所以使用Java基本的數據類型long是無法存儲這么多位的數據的,需要采用了BigInteger
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73292.html
摘要:需求項目有一個保存實時抓拍圖片的功能需要統計攝像頭下每個時間點比如一分鐘保存的圖片個數并通過線型圖顯示到頁面上這很類似股票的分時線圖的功能所以我參考了一些網上的文章采用來實現這個功能先交代一下項目里數據的一個情況攝像頭個數在個左右單個攝像頭 需求: 項目有一個保存實時抓拍圖片的功能,需要統計攝像頭下每個時間點(比如一分鐘)保存的圖片個數,并通過線型圖顯示到頁面上.這很類似股票的分時K...
摘要:小安分析的數據主要是用戶使用代理訪問日志記錄信息,要分析的原始數據以的形式存儲。下面小安帶小伙伴們一起來管窺管窺這些數據。在此小安一定一定要告訴你,小安每次做數據分析時必定使用的方法方法。 隨著網絡安全信息數據大規模的增長,應用數據分析技術進行網絡安全分析成為業界研究熱點,小安在這次小講堂中帶大家用Python工具對風險數據作簡單分析,主要是分析蜜罐日志數據,來看看一般大家都使用代理i...
摘要:因為本人在成都從事前端,所以這次爬取的關鍵詞既是成都,前端。僅僅有這個是不夠的,因為貌似拉勾網有反爬蟲,沒有好像得不到數據這個還待論證,至少我這邊是。 前言 showImg(https://segmentfault.com/img/bV1g4S?w=700&h=490); 今天是2018的第一天,首先祝各位小伙伴元旦快樂!又到了新的一年,雖然離春節還有一段時間,但是程序狗打工不易啊,不...
摘要:因為本人在成都從事前端,所以這次爬取的關鍵詞既是成都,前端。僅僅有這個是不夠的,因為貌似拉勾網有反爬蟲,沒有好像得不到數據這個還待論證,至少我這邊是。 前言 showImg(https://segmentfault.com/img/bV1g4S?w=700&h=490); 今天是2018的第一天,首先祝各位小伙伴元旦快樂!又到了新的一年,雖然離春節還有一段時間,但是程序狗打工不易啊,不...
閱讀 3392·2021-09-22 15:17
閱讀 2740·2021-09-02 15:15
閱讀 1750·2019-08-30 15:54
閱讀 2001·2019-08-30 14:02
閱讀 2529·2019-08-29 16:58
閱讀 2988·2019-08-29 16:08
閱讀 1330·2019-08-26 12:24
閱讀 1653·2019-08-26 10:41