Java版本的 ip地址和int數(shù)字的相互轉(zhuǎn)換
對(duì)于ipv4的地址來(lái)說(shuō),如果用字符串的形式存儲(chǔ)的話,其占用字節(jié)就比較大,比如對(duì)于IPv4地址0.0.0.0的字符串,就需要7個(gè)字節(jié),IPv4為255.255.255.255 的字符串,需要15個(gè)字節(jié),也就是說(shuō)存儲(chǔ)一個(gè)ip需要占用7~15個(gè)字節(jié)。
那么有沒(méi)有更節(jié)省空間的存儲(chǔ)方式呢?答案是有。
方案1:
直接把字符串中的'.'去掉,不就變成一個(gè)數(shù)字了嘛,比如 "255.255.255.255" 變成 255255255255,然而我們知道int所能表示的最大值 = Integer.MAX_VALUE = 2^31-1 = 2147483647, 255255255255 > 2^31-1,所以需要用長(zhǎng)整形long來(lái)表示,長(zhǎng)整形占用8個(gè)字節(jié),也就是說(shuō)我們將7~15個(gè)字節(jié)轉(zhuǎn)換為8字節(jié),在絕大多數(shù)情況下是節(jié)省空間了的。
方案2:
因?yàn)榭紤]到IPv4的地址本質(zhì)上就是32位的二進(jìn)制串,而一個(gè)int類型的數(shù)字剛好為4個(gè)字節(jié)32個(gè)bit位,所以剛好可以用一個(gè)int類型的數(shù)字轉(zhuǎn)表示IPv4地址。所以,我們可以用4個(gè)字節(jié)的int數(shù)字表示一個(gè)ip地址,這樣可以大大節(jié)省空間。
這里只討論方案2 :)
演示
對(duì)于ipv4地址: 192.168.1.3:
每段都用二進(jìn)制表示: 192(10) = 11000000(2) ; 168(10) = 10101000(2) ; 1(10) = 00000001(2) ; 3(10) = 00000011(2) 。
所以連在一起就是:11000000101010000000000100000011,對(duì)應(yīng)的int數(shù)字就是-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
按位或結(jié)果 : 11000000 10101000 00000001 00000011
即 -1062731775
將int類型的數(shù)字轉(zhuǎn)換成ip地址,其實(shí)就是上述過(guò)程的逆過(guò)程,這里就不再贅述。
具體實(shí)現(xiàn)方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
package com.sunjs.kit; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * IPv4地址和int數(shù)字的互換 * @author sun */ public class IpKit { /** * IPv4地址轉(zhuǎn)換為int類型數(shù)字 * @param ipv4Addr * @return */ public static int ipToInt(String ipv4Addr) { // 判斷是否是ip格式的 if (!isIPv4Address(ipv4Addr)) throw new RuntimeException( "Invalid ip address" ); // 匹配數(shù)字 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的數(shù)字 String regex = lower + "(\\." + lower + "){3}" ; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(ipv4Addr); return matcher.matches(); } /** * 將int數(shù)字轉(zhuǎn)換成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實(shí)現(xiàn)ip地址和int數(shù)字的相互轉(zhuǎn)換的詳細(xì)內(nèi)容,更多關(guān)于Java ip和數(shù)字相互轉(zhuǎn)換的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://www.sunjs.com/article/detail/f6a49fa32bef4b63b26aa4a8ac551a79.html