IP地址和整数之间的转换

问题描述

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数。
举例:一个ip地址为10.0.3.193
每段数字             相对应的二进制数
10                           00001010
0                             00000000
3                             00000011
193                         11000001

组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。

数据范围:保证输入的是合法的 IP 序列

输入描述:

输入 
1 输入IP地址
2 输入10进制型的IP地址

输出描述:

输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址

问题分析

  • IP地址转十进制数

通过原理描述可知,IP地址转为十进制数,需要先通过字符串拆分将IP地址分为四段,再将其转为二进制数(确保每段都有8位),再将二进制数转为十进制数即可

  • 十进制数转IP地址

由于IP地址由4个8位字段组成,每个字段的取值范围是0-255。每个字段都可以看作是256进制表示的一个数字。所以,

IP地址 = 第1个字段 * 256^3 + 第2个字段 * 256^2 + 第3个字段 * 256^1 + 第4个字段 * 256^0

第1个字段乘以256的三次幂、第2个字段乘以256的二次幂、第3个字段乘以256的一次幂、第4个字段乘以256的零次幂。

因为IP地址由4段构成,所以要遍历四次(i从3开始),可以将遍历的次数标识看成指数,通过以上公式,可先通过 (long) Math.pow(256, i);得出每个字段所对应的权重(例:第一个字段对应的权重是 :256^3);

再通过  

待转换的长整型数  除以  用于转换的幂次数

能够获得每个8位部分的值

接着通过

待转换的长整型数  取模  用于转换的幂次数

获取每个8位部分中未转换的剩余部分

最后在每个字段后都添加上  .  ,将其存储到字符串中,转化为IP地址

代码实现

将IP地址转换为二进制数

 注意点:

①由于 . 需要进行转义才能识别,所以需要使用转义字符

②要将每一个整数都转为8位的二进制数

  public static String toBinarySystem(String decimalism){
        // 通过split()方法,将字符串通过  .  进行分割,将其分割为四个数
        // 由于 . 需要进行转义才能识别,所以需要使用转义字符\\
        String[] numbers = decimalism.split("\\.");
        // 定义StringBuffer 来接收二进制数
        StringBuffer buffer = new StringBuffer();
        // 遍历分割出来的四个数
        for (String number : numbers) {
            // 将字符串转换为int类型
            int num = Integer.parseInt(number);
            // 通过toBinaryString()方法将int类型的数转换为二进制数,并通过format()将每一个整数都转为8位的二进制数,有空白的地方,使用0进行填充
            String binary = String.format("%8s", Integer.toBinaryString(num)).replace(' ', '0');
            // 将得到的4个8位二进制数 一 一 添加到buffer中
            buffer.append(binary);
        }
        // 将StringBuffer转为String,并返回
        return buffer.toString();
    }

长整型数转换为IP地址

   public static String toIPAddress(long ipLong) {
        // 定义StringBuilder接收转换好的IP地址
        StringBuilder ipAddress = new StringBuilder();
        // 遍历4次
        for (int i = 3; i >= 0; i--) {
            // IP地址由4个8位字段组成,每个字段的取值范围是0-255。每个字段都可以看作是256进制表示的一个数字。
            //为了将4个字段合并为一个整数表示IP地址,需要进行如下计算:IP地址 = 第1个字段 * 256^3 + 第2个字段 * 256^2 + 第3个字段 * 256^1 + 第4个字段 * 256^0
                                                                                                                    // 第1个字段乘以256的三次幂、第2个字段乘以256的二次幂、第3个字段乘以256的一次幂、第4个字段乘以256的零次幂。
            //当使用Math.pow(256, i)计算时,i表示第i个字段的权重,即对应的指数(幂)。这里的i取值范围是0到3,对应IP地址中的4个字段。
            //通过使用指数幂运算,我们可以将每个字段乘以对应的权重,最后将它们相加得到表示整个IP地址的长整数值。
            long power = (long) Math.pow(256, i);
            // 待转换的长整型数  除以  用于转换的幂次数 ,通过ipLong / power,能够获得每个8位部分的值
            //在IP地址的表示中,每个点分十进制的部分都对应一个8位的二进制数。通过将长整型数 ipLong 除以 256 的幂次数(即 power),可以得到每个部分的值
            long value = ipLong / power;
            // ipLong %= power 用于获取每个8位部分中未转换的剩余部分,以便进行下一个循环迭代
            ipLong %= power;
            // 在前三个数(i的值为0,1,2时)中,每个数结束后添加  .
            if (i < 3) {
                ipAddress.append(".");
            }else{
                // 将获得到的整型数添加进StringBuilder中
                ipAddress.append(value);
            }
        }
        // 将StringBuilder转换为String类型返回
        return ipAddress.toString();
    }

 运行测试

在这个地方实现将二进制数转为十进制数

        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            // 输入IP地址
            String decimalism = in.next();
            // 输入IP地址十进制的长整型数
            long binarynum = in.nextLong();
            // 调用toBinarySystem(),将IP地址转为二进制数
            String binary = toBinarySystem(decimalism);
            // 通过parseLong(),将二进制数转为十进制数
            Long target = Long.parseLong(binary, 2);
            // 将十进制数输出
            System.out.println(target);
            // 调用toIPAddress(),将IP地址十进制的长整型数  转为  IP地址,并输出
            System.out.println(toIPAddress(binarynum));
    }

Over

若有更好的意见,请在评论区留言

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值