Java實(shí)現(xiàn)ip地址和int數(shù)字的相互轉(zhuǎn)換
Java版本的 ip地址和int數(shù)字的相互轉(zhuǎn)換
對(duì)于ipv4的地址來說,如果用字符串的形式存儲(chǔ)的話,其占用字節(jié)就比較大,比如對(duì)于IPv4地址0.0.0.0的字符串,就需要7個(gè)字節(jié),IPv4為255.255.255.255 的字符串,需要15個(gè)字節(jié),也就是說存儲(chǔ)一個(gè)ip需要占用7~15個(gè)字節(jié)。
那么有沒有更節(jié)省空間的存儲(chǔ)方式呢?答案是有。
方案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 :)
演示
對(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í)就是上述過程的逆過程,這里就不再贅述。
具體實(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|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)注腳本之家其它相關(guān)文章!
- 基于Java解決華為機(jī)試實(shí)現(xiàn)密碼截取?
- 基于Java解決華為機(jī)試之字符串加解密?
- ?基于Java解決華為機(jī)試之字符串合并處理實(shí)操
- java實(shí)現(xiàn)IP地址轉(zhuǎn)換
- Java實(shí)現(xiàn)IP地址到二進(jìn)制的轉(zhuǎn)換
- Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例
- 使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法
- java實(shí)現(xiàn)ip地址與十進(jìn)制數(shù)相互轉(zhuǎn)換
- 基于Java解決華為機(jī)試實(shí)現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換?
相關(guān)文章
Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目的詳細(xì)步驟
這篇文章主要介紹了Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Java的項(xiàng)目構(gòu)建工具M(jìn)aven的配置和使用教程
Maven是Java世界中的項(xiàng)目管理和構(gòu)建自動(dòng)化工具,基于POM項(xiàng)目對(duì)象模型的思想,下面我們就具體來看一下具體的Java的項(xiàng)目構(gòu)建工具M(jìn)aven的配置和使用教程:2016-05-05
Maven倉庫無用文件和文件夾清理的方法實(shí)現(xiàn)
這篇文章主要介紹了Maven倉庫無用文件和文件夾清理的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
java解析php函數(shù)json_encode unicode 編碼問題
這篇文章主要介紹了java解析php函數(shù)json_encode unicode 編碼問題,需要的朋友可以參考下2016-04-04
Mybatis實(shí)現(xiàn)分包定義數(shù)據(jù)庫的原理與過程
這篇文章主要給大家介紹了關(guān)于Mybatis實(shí)現(xiàn)分包定義數(shù)據(jù)庫的原理與過程,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01
springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn)代碼
這篇文章主要介紹了springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn),JSR303校驗(yàn)方法有統(tǒng)一校驗(yàn)的需求,統(tǒng)一校驗(yàn)實(shí)現(xiàn)以及分組校驗(yàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
spring boot 集成 shiro 自定義密碼驗(yàn)證 自定義freemarker標(biāo)簽根據(jù)權(quán)限渲染不同頁面(推薦
這篇文章主要介紹了spring-boot 集成 shiro 自定義密碼驗(yàn)證 自定義freemarker標(biāo)簽根據(jù)權(quán)限渲染不同頁面,需要的朋友可以參考下2018-12-12
javaWEB實(shí)現(xiàn)相冊(cè)管理的簡單功能
這篇文章主要介紹了javaWEB實(shí)現(xiàn)相冊(cè)管理的簡單功能,包括圖片的上傳、統(tǒng)一瀏覽、單個(gè)下載、單個(gè)刪除,還有一個(gè)功能只能刪除自己上傳的文件,感興趣的小伙伴們可以參考一下2015-11-11

