您好,登錄后才能下訂單哦!
Java版本的 ip地址和int數字的相互轉換
對于ipv4的地址來說,如果用字符串的形式存儲的話,其占用字節就比較大,比如對于IPv4地址0.0.0.0的字符串,就需要7個字節,IPv4為255.255.255.255 的字符串,需要15個字節,也就是說存儲一個ip需要占用7~15個字節。
那么有沒有更節省空間的存儲方式呢?答案是有。
方案1:
直接把字符串中的'.'去掉,不就變成一個數字了嘛,比如 "255.255.255.255" 變成 255255255255,然而我們知道int所能表示的最大值 = Integer.MAX_VALUE = 2^31-1 = 2147483647, 255255255255 > 2^31-1,所以需要用長整形long來表示,長整形占用8個字節,也就是說我們將7~15個字節轉換為8字節,在絕大多數情況下是節省空間了的。
方案2:
因為考慮到IPv4的地址本質上就是32位的二進制串,而一個int類型的數字剛好為4個字節32個bit位,所以剛好可以用一個int類型的數字轉表示IPv4地址。所以,我們可以用4個字節的int數字表示一個ip地址,這樣可以大大節省空間。
這里只討論方案2 :)
演示
對于ipv4地址: 192.168.1.3:
每段都用二進制表示: 192(10) = 11000000(2) ; 168(10) = 10101000(2) ; 1(10) = 00000001(2) ; 3(10) = 00000011(2) 。
所以連在一起就是:11000000101010000000000100000011,對應的int數字就是-1062731775 。
具體算法分析:
192左移24位: 11000000 00000000 00000000 00000000
168左移16位: 00000000 10101000 00000000 00000000
001左移08位: 00000000 00000000 00000001 00000000
003左移00位: 00000000 00000000 00000000 00000011
按位或結果 : 11000000 10101000 00000001 00000011
即 -1062731775
將int類型的數字轉換成ip地址,其實就是上述過程的逆過程,這里就不再贅述。
具體實現方式:
package com.sunjs.kit; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * IPv4地址和int數字的互換 * @author sun */ public class IpKit { /** * IPv4地址轉換為int類型數字 * @param ipv4Addr * @return */ public static int ipToInt(String ipv4Addr) { // 判斷是否是ip格式的 if (!isIPv4Address(ipv4Addr)) throw new RuntimeException("Invalid ip address"); // 匹配數字 Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(ipv4Addr); int result = 0; int counter = 0; while (matcher.find()) { int value = Integer.parseInt(matcher.group()); result = (value << 8 * (3 - counter++)) | result; } return result; } /** * 判斷是否為ipv4地址 * @param ipv4Addr * @return */ private static boolean isIPv4Address(String ipv4Addr) { String lower = "(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])"; // 0-255的數字 String regex = lower + "(\\." + lower + "){3}"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(ipv4Addr); return matcher.matches(); } /** * 將int數字轉換成ipv4地址 * @param ip * @return */ public static String intToIp(int ip) { StringBuilder sb = new StringBuilder(); int num = 0; boolean needPoint = false; // 是否需要加入'.' for (int i = 0; i < 4; i++) { if (needPoint) { sb.append('.'); } needPoint = true; int offset = 8 * (3 - i); num = (ip >> offset) & 0xff; sb.append(num); } return sb.toString(); } public static void main(String[] args) { String ip = "124.202.200.166"; System.out.println(ipToInt(ip)); System.out.println(intToIp(2093664422)); } }
以上就是Java實現ip地址和int數字的相互轉換的詳細內容,更多關于Java ip和數字相互轉換的資料請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。