Java子网掩码与网络标示相互转换

子网掩码通常有以下2种格式的表示方法:

  1. 通过与IP地址格式相同的点分十进制表示

  如:255.0.0.0 或 255.255.255.128

  2. 在IP地址后加上"/"符号以及1-32的数字,其中1-32的数字表示子网掩码中网络标识位的长度

  如:192.168.1.1/24 的子网掩码也可以表示为 255.255.255.0

public String calcMaskByPrefixLength(int length) {//输出长度获得子网掩码
int mask = -1 << (32 - length);
int partsNum = 4;
int bitsOfPart = 8;
int maskParts[] = new int[partsNum];
int selector = 0x000000ff;
for (int i = 0; i < maskParts.length; i++) {
int pos = maskParts.length - 1 - i;
maskParts[pos] = (mask >> (i * bitsOfPart)) & selector;
}
String result = "";
result = result + maskParts[0];
for (int i = 1; i < maskParts.length; i++) {
result = result + "." + maskParts[i];
}
return result;
// return (maskParts[0] << 24) + (maskParts[1] << 16) + (maskParts[2] <<
// 8) + (maskParts[3]);
}


public int calcPrefixLengthByMack(String strip) {//输入子网掩码获得长度
StringBuffer sbf;
String str;
// String strip = "255.255.255.0"; // 子网掩码
int inetmask = 0, count = 0; // 子网掩码缩写代码
String[] ipList = strip.split("\\.");
for (int n = 0; n < ipList.length; n++) {
sbf = toBin(Integer.parseInt(ipList[n]));
str = sbf.reverse().toString();
Log.i("wqm", ipList[n] + "---" + str);


// 统计2进制字符串中1的个数
count = 0;
for (int i = 0; i < str.length(); i++) {
i = str.indexOf('1', i); // 查找 字符'1'出现的位置
if (i == -1) {
break;
}
count++; // 统计字符出现次数
}
inetmask += count;
}
return inetmask;
}


public StringBuffer toBin(int x) {
StringBuffer result = new StringBuffer();
result.append(x % 2);
x /= 2;
while (x > 0) {
result.append(x % 2);
x /= 2;
}
return result;
}

Java中计算子网掩码可以使用位运算来实现。在计算子网掩码时,我们首先需要知道网络地址和子网掩码的位数。网络地址是一个32位的二进制数,子网掩码是用来标识网络地址中哪些位是网络位和主机位的。 例如,假设网络地址为192.168.0.1,子网掩码为255.255.255.0,我们需要将它们转换成二进制。首先,可以使用Java中提供的InetAddress类的方法将IP地址转换成对应的二进制。 ```java InetAddress inetAddress = InetAddress.getByName("192.168.0.1"); byte[] ipAddress = inetAddress.getAddress(); String ipAddressBinary = ""; for (byte octet : ipAddress) { ipAddressBinary += String.format("%8s", Integer.toBinaryString(octet & 0xFF)).replace(" ", "0"); } System.out.println(ipAddressBinary); ``` 输出结果为: ```bash 11000000101010000000000000000001 ``` 接下来,我们需要将子网掩码转换成二进制。同样可以使用上述的方法将子网掩码转换成二进制。假设使用的子网掩码为255.255.255.0,将其转换成二进制如下: ```bash 11111111111111111111111100000000 ``` 接下来,我们需要计算子网掩码网络位的个数,也就是子网掩码中连续为1的位数。可以使用Java的位运算来实现: ```java int maskBits = 0; for (char bit : subnetMaskBinary.toCharArray()) { if (bit == '1') { maskBits++; } } System.out.println("网络位个数:" + maskBits); ``` 输出结果为: ```bash 网络位个数:24 ``` 最后,我们可以根据网络位的个数来计算子网掩码的十进制表示形式: ```java int mask = 0xFFFFFFFF << (32 - maskBits); byte[] subnetMask = { (byte) (mask & 0xFF), (byte) ((mask >> 8) & 0xFF), (byte) ((mask >> 16) & 0xFF), (byte) ((mask >> 24) & 0xFF) }; System.out.println("子网掩码:" + InetAddress.getByAddress(subnetMask).getHostAddress()); ``` 输出结果为: ```bash 子网掩码:255.255.255.0 ``` 以上便是使用Java来计算子网掩码的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值