java實(shí)現(xiàn)ip地址與十進(jìn)制數(shù)相互轉(zhuǎn)換
代碼如下
classip
{
privatestaticlongiptolong(stringstrip)
//將127.0.0.1形式的ip地址轉(zhuǎn)換成10進(jìn)制整數(shù),這里沒有進(jìn)行任何錯(cuò)誤處理
{
intj=0;
inti=0;
long[]ip=newlong[4];
intposition1=strip.indexof(".");
intposition2=strip.indexof(".",position1+1);
intposition3=strip.indexof(".",position2+1);
ip[0]=long.parselong(strip.substring(0,position1));
ip[1]=long.parselong(strip.substring(position1+1,position2));
ip[2]=long.parselong(strip.substring(position2+1,position3));
ip[3]=long.parselong(strip.substring(position3+1));
return(ip[0]<<24)+(ip[1]<<16)+(ip[2]<<8)+ip[3];//ip1*256*256*256+ip2*256*256+ip3*256+ip4
}
privatestaticstringlongtoip(longlongip)
//將10進(jìn)制整數(shù)形式轉(zhuǎn)換成127.0.0.1形式的ip地址,在命令提示符下輸入ping3396362403l
{
stringbuffersb=newstringbuffer("");
sb.append(string.valueof(longip>>>24));//直接右移24位
sb.append(".");
sb.append(string.valueof((longip&0x00ffffff)>>>16));//將高8位置0,然后右移16位
sb.append(".");
sb.append(string.valueof((longip&0x0000ffff)>>>8));
sb.append(".");
sb.append(string.valueof(longip&0x000000ff));
sb.append(".");
returnsb.tostring();
}
publicstaticvoidmain(string[]args)
{
system.out.println("ip地址的各種表現(xiàn)形式:rn");
system.out.print("32位二進(jìn)制形式:");
system.out.println(long.tobinarystring(3396362403l));
system.out.print("十進(jìn)制形式:");
system.out.println(iptolong("202.112.96.163"));
system.out.print("普通形式:");
system.out.println(longtoip(3396362403l));
}
}
運(yùn)行結(jié)果:
ip地址的各種表現(xiàn)形式:
32位二進(jìn)制形式:11001010011100000110000010100011
十進(jìn)制形式:3396362403
普通形式:202.112.96.163.
輸出完成(耗時(shí)1秒)-正常終止
我們?cè)僖徊讲椒珠_來分析一下
知識(shí)點(diǎn):一個(gè)二進(jìn)制數(shù),按位左移n位,就是把該數(shù)的值乘以2的n次方
二進(jìn)制除二即右移一位
1、IP地址轉(zhuǎn)換為整數(shù)
原理:IP地址每段可以看成是8位無符號(hào)整數(shù)即0-255,把每段拆分成一個(gè)二進(jìn)制形式組合起來,然后把這個(gè)二進(jìn)制數(shù)轉(zhuǎn)變成
一個(gè)無符號(hào)32為整數(shù)。
舉例:一個(gè)ip地址為10.0.3.193
每段數(shù)字相對(duì)應(yīng)的二進(jìn)制數(shù)
1000001010
000000000
300000011
19311000001
組合起來即為:00001010000000000000001111000001,轉(zhuǎn)換為10進(jìn)制就是:167773121,即該IP地址轉(zhuǎn)換后的數(shù)字就是它了。
代碼如下
publicclassIp{
publicstaticvoidmain(String[]args){
System.out.print(ip2int("10.0.3.193"));
}
publicstaticlongip2int(Stringip){
String[]items=ip.split(".");
returnLong.valueOf(items[0])<<24
|Long.valueOf(items[1])<<16
|Long.valueOf(items[2])<<8
|Long.valueOf(items[3]);
}
}
2、整數(shù)轉(zhuǎn)換為IP地址
原理:把這個(gè)整數(shù)轉(zhuǎn)換成一個(gè)32位二進(jìn)制數(shù)。從左到右,每8位進(jìn)行一下分割,得到4段8位的二進(jìn)制數(shù),把這些二進(jìn)制數(shù)轉(zhuǎn)換成整數(shù)然后加上”?!本褪沁@個(gè)ip地址了
舉例:167773121
二進(jìn)制表示形式為:00001010000000000000001111000001
分割成四段:00001010,00001010,00000011,11000001,分別轉(zhuǎn)換為整數(shù)后加上“?!本偷玫搅?0.0.3.193。
代碼如下
publicclassIp{
publicstaticvoidmain(String[]args){
System.out.print(int2ip(167773121));
}
publicstaticStringint2ip(longipInt){
StringBuildersb=newStringBuilder();
sb.append(ipInt&0xFF).append(".");
sb.append((ipInt>>8)&0xFF).append(".");
sb.append((ipInt>>16)&0xFF).append(".");
sb.append((ipInt>>24)&0xFF);
returnsb.toString();
}
}
- 基于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實(shí)現(xiàn)ip地址和int數(shù)字的相互轉(zhuǎn)換
- Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例
- 使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法
- 基于Java解決華為機(jī)試實(shí)現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換?
相關(guān)文章
Java紅黑樹的數(shù)據(jù)結(jié)構(gòu)與算法解析
紅黑樹問題是各大計(jì)算機(jī)考研命題以及面試算法題目中的熱門,接下來我們?yōu)榇蠹覉D解紅黑樹的數(shù)據(jù)結(jié)構(gòu)與算法解析,需要的朋友可以參考下2021-08-08Java8中List轉(zhuǎn)換String字符串幾種方式
這篇文章主要給大家介紹了關(guān)于Java8中List轉(zhuǎn)換String字符串的幾種方式,在實(shí)際開發(fā)中經(jīng)常遇到List轉(zhuǎn)為String字符串的情況,文中給出了幾種方法的示例代碼,需要的朋友可以參考下2023-07-07SpringBoot整合Shiro實(shí)現(xiàn)登錄認(rèn)證的方法
這篇文章主要介紹了SpringBoot整合Shiro實(shí)現(xiàn)登錄認(rèn)證的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02Springboot整合Redis實(shí)現(xiàn)超賣問題還原和流程分析(分布式鎖)
最近在研究超賣的項(xiàng)目,寫一段簡單正常的超賣邏輯代碼,多個(gè)用戶同時(shí)操作同一段數(shù)據(jù)出現(xiàn)問題,糾結(jié)該如何處理呢?下面小編給大家?guī)砹薙pringboot整合Redis實(shí)現(xiàn)超賣問題還原和流程分析,感興趣的朋友一起看看吧2021-10-10Java+EasyExcel實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了如何通過Java和EasyExcel實(shí)現(xiàn)文件上傳功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02Java語言基于無向有權(quán)圖實(shí)現(xiàn)克魯斯卡爾算法代碼示例
這篇文章主要介紹了Java語言基于無向有權(quán)圖實(shí)現(xiàn)克魯斯卡爾算法代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11Maven倉庫無用文件和文件夾清理的方法實(shí)現(xiàn)
這篇文章主要介紹了Maven倉庫無用文件和文件夾清理的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Mybatis使用注解實(shí)現(xiàn)復(fù)雜動(dòng)態(tài)SQL的方法詳解
當(dāng)使用 MyBatis 注解方式執(zhí)行復(fù)雜 SQL 時(shí),你可以使用 @Select、@Update、@Insert、@Delete 注解直接在接口方法上編寫 SQL,本文給大家介紹了Mybatis如何使用注解實(shí)現(xiàn)復(fù)雜動(dòng)態(tài)SQL,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2023-12-12JVM分配和回收堆外內(nèi)存的方式與注意點(diǎn)
JVM啟動(dòng)時(shí)分配的內(nèi)存稱為堆內(nèi)存,與之相對(duì)的,在代碼中還可以使用堆外內(nèi)存,比如Netty,廣泛使用了堆外內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于JVM分配和回收堆外內(nèi)存的方式與注意點(diǎn),需要的朋友可以參考下2022-07-07