IP进行long和String互转

IP进行long和String互转

ip是个啥,ip是个4个byte,1byte有8bit中间用 '.'连接起来的串。

举个粒子:IP:202.203.158.148

其表示为二进制就是:11001010.11001011.10011110.10010100

对于二进制,如果我们想把它转成long类型脑子一热就是加起来,但是直接加起来容易恢复起来不容易。因为ip中的每个子段(比如202.203.158.148中我们姑且称202或203这样由 . 分隔的为一段)其最大值就255,二进制表示其不会超过8位,所以我们可以将其前面的段左移一定的位数来给后面的段挪个位置。最后面一段可以不要挪,因为转成了二进制,所以最后面一段的前面一段可以挪8位,最后面一段前面一段的前面一段挪16位,首段挪24位。倒过来(从右往左看就是正确的二进制值)大概就是下面这样子:

第一段:00000000 00000000 00000000 11001010 —> 移动方向 (高位)

第二段:00000000 00000000 11001011

第三段:00000000 10011110

第四段:10010100

四段相加得:11001010110010111001111010010100

将其转成十进制(级long类型)为: 3,402,342,036

现在这样子就可以愉快的加起来了,想用解析的时候转成二进制,只要第一段右移24为,第二段右移16位,第三段右移8位即为原来的值。

java实现

public class TestMethod {

    public static void main(String[] args){
        long l = new TestMethod().strIP2Long("202.203.158.148");
        System.out.println(new TestMethod().longIP2String(l));
    }

    //ip string 转long
    public long strIP2Long(String ip) {
        String[] ipStrs = ip.split("\\.");
        long firstIP = Long.valueOf(ipStrs[0]) << 24 ;
        long second = Long.valueOf(ipStrs[1]) << 16;
        long three = Long.valueOf(ipStrs[2]) << 8;
        long last = Long.valueOf(ipStrs[3]) ;
        return firstIP + second + three + last;
    }

    //long ip 转string
    public String longIP2String(long longIP) {
        String ipStr = Long.toString(longIP, 2);
        String first = Long.toString(Long.parseUnsignedLong(ipStr.substring(0, 8),2), 10);
        String second =Long.toString(Long.parseUnsignedLong(ipStr.substring(8, 16),2), 10);
        String three = Long.toString(Long.parseUnsignedLong(ipStr.substring(16, 24),2), 10);
        String last = Long.toString(Long.parseUnsignedLong(ipStr.substring(24, 32),2), 10);
        return String.valueOf(first + "." + second + "." + three + "." + last);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值