java - 如何使字符串表现得像整数?

标签 java string integer ip transform

我是一个正在尝试学习 Java 的新手。目前正在制作一些小程序来练习。

我正在尝试制作一个程序,给定用户所需的IPV4地址、网络掩码和子网数量,可以输出每个子网的网络IP、主机IP范围和广播IP。

问题是,如何将用户给定的 IPV4 地址转换为像整数一样的行为,以向其添加数字并提前显示它?

例如:

给定 IPV4 地址:10.2.0.0/19
所需子网:40

子网 0 将从 10.2.0.0 开始到 10.2.0.127。

如何输出 10.2.0.0 到 10.2.0.127 的变换?从最后一个到 10.2.0.255,这是下一个子网 1 的 IP 范围。

到目前为止,我已经尝试过:

        while(Subnet > scounter) {
        String finalip = IPV4Add.substring(0, IPV4Add.length() - 1) + (MagicNum - 1);
        System.out.println("Subnet " + scounter + " Net Address: " + IPV4Add + " to " + finalip);
        scounter++;
        }

输出(只有 3 行而不是 39 行):

Subnet 0 Net Address: 10.2.0.0 to 10.2.0.127
Subnet 1 Net Address: 10.2.0.0 to 10.2.0.127
Subnet 2 Net Address: 10.2.0.0 to 10.2.0.127

其中Subnet是用户需要的子网数量,scounter to是对输出的子网进行计数,MagicNum是应将其添加到 ip 中以获得下一个子网,在本例中为 128。

我如何编辑字符串,使其表现得像整数,并给我,在每个循环中添加:

Subnet 1 Net Address: 10.2.0.128 to 10.2.0.255 
Subnet 2 Net Address: 10.2.1.0 to 10.2.1.127
Subnet 3 Net Address: 10.2.1.128 to 10.2.1.255

等等?

提前致谢。

最佳答案

如果我正确理解了这个问题,您希望输出一个范围列表,范围之间的差异等于 128。实现此目的的一种方法是定义一种新的加法方法,该方法将数字视为 IP 地址中的字段。

第一步是分割 IP 地址字符串并将其存储为包含四个数字的整数数组。

String[] stringIPAddr = "10.2.0.0".split("\\.");
int[] ipAddr = new int[4];
for(int j = 0; j < 4; j++) {
    ipAddr[j] = Integer.parseInt(stringIPAddr[j]);
}

这个问题的范围非常明确。它们都以 0 开始,以 127 结束。下一个范围以 128 开始,以 255 结束。以下函数负责跳转到范围中的下一个值就地:

void nextAddr(int[] number) {
    if(number[3] == 0) number[3] = 127 ;
    else if(number[3] == 128) number[3] = 255;
}

打印该范围的第一个和最后一个值后,我们希望将其加一并转到下一个范围。这里,如果最后一个字段等于 255,我们还应该小心地正确增加数字。在这种情况下,进位会通过字段传播(就像常规加法/减法一样):

void increment (int[] number) {
    int carry = 1;
    for(int i = 3; i >=0; i--) {
        number[i] += carry;
        if(number[i] == 256) {
            carry = 1;
            number[i] = 0;
        } else carry = 0;
    }
}

该函数将 IP 地址原地加一。如果某个字段变为 256,则该函数将该字段设置为零,并将进位传播到求和运算中的下一个字段。这个想法就像常规加法一样,但经过修改,如果数字等于 256,则进位转到前一个字段。

有了nextAddr和increment方法,编写主循环就很容易了:

for(int i = 0; i < subNetWorks; i++) {
        System.out.print("Subnet " + i + " Net Address:" +
                Arrays.toString(ipAddr) + " to ");
        nextAddr(ipAddr);
        System.out.println(Arrays.toString(ipAddr));
        increment(ipAddr);
    }

输出:

Subnet 0 Net Address:[10, 2, 0, 0] to [10, 2, 0, 127]
Subnet 1 Net Address:[10, 2, 0, 128] to [10, 2, 0, 255]
Subnet 2 Net Address:[10, 2, 1, 0] to [10, 2, 1, 127]
Subnet 3 Net Address:[10, 2, 1, 128] to [10, 2, 1, 255]
Subnet 4 Net Address:[10, 2, 2, 0] to [10, 2, 2, 127]
Subnet 5 Net Address:[10, 2, 2, 128] to [10, 2, 2, 255]
Subnet 6 Net Address:[10, 2, 3, 0] to [10, 2, 3, 127]

为了简单起见,我避免讨论一些极端情况。例如,如果用户输入无效的 IP 地址或者用户输入类似 255.255.255.0 的地址并询问接下来的 100 个子网,会发生什么情况?

关于java - 如何使字符串表现得像整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59493575/

相关文章:

php - 为什么 PHP 使用 Zend_Amf 将数字 16 转换为 float(6.1026988574311E_320)

php - PHP 中增加十六进制值(小端?)

java - 获取类的所有方法的新方法是什么,包括 Java 8 的继承默认方法?

java - elasticsearch 2.4 java 1.7连接错误NoNodeAvailableException

java - 如何检查 Map 中的键是否以给定的字符串值开头

c - 返回 char* 的空数组

php - Base64 编码或 bin2hex 随机字符串

php - 在 PHP 中将大整数转换为完整字符串

Java RMI 引用

Java:充满接口(interface)元素的数据结构 - 如何强制实现接口(interface)的类实现compareTo()?