色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

Java實(shí)現(xiàn)ip地址和int數(shù)字的相互轉(zhuǎn)換

瀏覽:5日期:2022-08-24 17:06:43

Java版本的 ip地址和int數(shù)字的相互轉(zhuǎn)換

對于ipv4的地址來說,如果用字符串的形式存儲的話,其占用字節(jié)就比較大,比如對于IPv4地址0.0.0.0的字符串,就需要7個(gè)字節(jié),IPv4為255.255.255.255 的字符串,需要15個(gè)字節(jié),也就是說存儲一個(gè)ip需要占用7~15個(gè)字節(jié)。

那么有沒有更節(jié)省空間的存儲方式呢?答案是有。

方案1:

直接把字符串中的’.’去掉,不就變成一個(gè)數(shù)字了嘛,比如 '255.255.255.255' 變成 255255255255,然而我們知道int所能表示的最大值 = Integer.MAX_VALUE = 2^31-1 = 2147483647, 255255255255 > 2^31-1,所以需要用長整形long來表示,長整形占用8個(gè)字節(jié),也就是說我們將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 :)

演示

對于ipv4地址: 192.168.1.3:

每段都用二進(jìn)制表示: 192(10) = 11000000(2) ; 168(10) = 10101000(2) ; 1(10) = 00000001(2) ; 3(10) = 00000011(2) 。

所以連在一起就是:11000000101010000000000100000011,對應(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í)就是上述過程的逆過程,這里就不再贅述。

具體實(shí)現(xiàn)方式:

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|1d{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)換的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 在线亚洲精品中文字幕美乳 | 日韩欧美一区二区在线观看 | 韩国一级理黄论片 | 日本欧美一区二区三区不卡视频 | 女人张开腿让男人桶免费最新 | 久草国产在线 | 成人午夜视频在线观 | 91免费国产高清观看 | 一本色综合 | 国产一区二区三区高清 | 国产欧美成人不卡视频 | 中文字幕一区二区三区亚洲精品 | 国产精品国产 | 日本68xxxxxxxxx老师| 久草视频精品在线 | 一级午夜a毛片免费视频 | 美国免费毛片 | 亚洲成人高清在线观看 | 日韩影院久久 | 日本精品网 | 美女把张开腿男生猛戳免费视频 | 国产成人亚洲精品 | 日本特级淫片免费 | 久久久久久久综合色一本 | 欧美午夜三级我不卡在线观看 | 国产情侣真实露脸在线最新 | 国产精品久久国产三级国不卡顿 | 亚洲综合91| 九九色在线视频 | 国产v视频 | 一级毛片q片 | 国产成人久久精品激情91 | 男人的天堂精品国产一区 | 日韩中文字幕免费在线观看 | 日韩欧美一区二区三区免费观看 | 亚洲午夜精品一级在线播放放 | 国产在线视频h | 中国女人真人一级毛片 | 久精品在线观看 | 美女视频黄色的免费 | 亚洲视频在线一区二区 |