Java实现已知IP地址和子网掩码获取网络号和主机号

本文介绍了一种使用Java程序计算给定IP地址和子网掩码下的网络号与主机号的方法。通过将IP地址和子网掩码转换为二进制形式,并进行位运算,实现了网络号与主机号的有效计算。

这段代码有很多需要优化的地方,小编是为了完成标题的功能才写的所以没有做过多的优化,望大家见谅!

​
package com.lanqiao;

import java.util.Scanner;

/*
 * 已知IP地址和子网掩码来获得对应的网络号和主机号
 */
public class Lm1 {
	//ip和子网掩码的实现类:如ip:192.168.43.169   子网掩码:255.255.255.0
	static class  dz{
		int ip1;//192或255
		int ip2;//168或255
		int ip3;//43或255
		int ip4;//169或0
		public int getIp1() {
			return ip1;
		}
		public void setIp1(int ip1) {
			this.ip1 = ip1;
		}
		public int getIp2() {
			return ip2;
		}
		public void setIp2(int ip2) {
			this.ip2 = ip2;
		}
		public int getIp3() {
			return ip3;
		}
		public void setIp3(int ip3) {
			this.ip3 = ip3;
		}
		public int getIp4() {
			return ip4;
		}
		public void setIp4(int ip4) {
			this.ip4 = ip4;
		}
		
	}
	public static int int_byte1(int n,int m) {
		byte[] b1=new byte[8];//ip地址的二进制
		byte[] b2=new byte[8];//子网掩码的二进制
		byte[] b3=new byte[8];//网络号的二进制
		int a=0;
		//将ip地址转化成二进制
		for(int i=b1.length-1;i>=0;i--) {
			b1[i]=(byte) (n%2);
			n=n/2;
		}
		//将子网掩码转换成二进制
		for(int i=b2.length-1;i>=0;i--) {
			b2[i]=(byte) (m%2);
			m=m/2;
		}
		//网络号的二进制
		for(int i=0;i<8;i++) {
			b3[i]=(byte) (b1[i]&b2[i]);
		}
		//网络号的十进制
		for(int i=7;i>=0;i--) {
			a+=(int)b3[i]*(int)Math.pow(2, 7-i);
		}
		return a;
	}
	
	public static int int_byte2(int n,int m) {
		byte[] b1=new byte[8];//ip地址的二进制
		byte[] b2=new byte[8];//子网掩码的二进制
		byte[] b3=new byte[8];//网络号的二进制
		byte[] b4=new byte[8];//子网掩码的二进制取反
		int a=0;
		//将ip地址转化成二进制
		for(int i=b1.length-1;i>=0;i--) {
			b1[i]=(byte) (n%2);
			n=n/2;
		}
		//将子网掩码转换成二进制
		for(int i=b2.length-1;i>=0;i--) {
			b2[i]=(byte) (m%2);
			m=m/2;
		}
		
		//将子网掩码的二进制取反
		for(int i=0;i<b2.length;i++) {
			if(b2[i]==1)
				b4[i]=0;
			if(b2[i]==0)
				b4[i]=1;
		}
		//主机号的二进制
		for(int i=0;i<8;i++) {
			b3[i]=(byte) (b1[i]&b4[i]);
		}
		//网络号的十进制
		for(int i=7;i>=0;i--) {
			a+=(int)b3[i]*(int)Math.pow(2, 7-i);
		}
		return a;
	}
	public static void main(String[] args) {
		dz dz1=new dz();
		dz dz2=new dz();
		Scanner scanner=new Scanner(System.in);
		String string1=scanner.nextLine();
		String string2=scanner.nextLine();
		//需要注意的是,该方法的参数是个正则表达式,要注意对某些字符做转码。
		//例如,.在正则表达式中表示任意字符,因此,如果你要通过.号做分割,需要这样写,split("\\.")
		//或者split(Pattern.quote("."))
		String ip1[]=string1.split("\\.");
		if(ip1!=null && ip1.length==4) {
			dz1.setIp1(Integer.parseInt(ip1[0]));
			dz1.setIp2(Integer.parseInt(ip1[1]));
			dz1.setIp3(Integer.parseInt(ip1[2]));
			dz1.setIp4(Integer.parseInt(ip1[3]));
		}
		
		String ip2[]=string2.split("\\.");
		if(ip2!=null && ip2.length==4) {
			dz2.setIp1(Integer.parseInt(ip2[0]));
			dz2.setIp2(Integer.parseInt(ip2[1]));
			dz2.setIp3(Integer.parseInt(ip2[2]));
			dz2.setIp4(Integer.parseInt(ip2[3]));
		}
		//219.224.3.18 & 255.255.255.248
		System.out.println("网络号:"+
				int_byte1(dz1.getIp1(),dz2.getIp1())+"."+
				int_byte1(dz1.getIp2(),dz2.getIp2())+"."+
				int_byte1(dz1.getIp3(),dz2.getIp3())+"."+
				int_byte1(dz1.getIp4(),dz2.getIp4())
				);
		System.out.println("主机号:"+
				int_byte2(dz1.getIp1(),dz2.getIp1())+"."+
				int_byte2(dz1.getIp2(),dz2.getIp2())+"."+
				int_byte2(dz1.getIp3(),dz2.getIp3())+"."+
				int_byte2(dz1.getIp4(),dz2.getIp4())
				);
		
	}
}

​

 

<think>我们已知:-IP地址(例如:192.168.1.10)-子网掩码(例如:255.255.255.0)广播地址计算方法:将IP地址子网掩码进行按位与运算得到网络地址,然后将子网掩码取反(按位非)后与网络地址进行按位或运算,即可得到广播地址。步骤:1.将IP地址子网掩码转换为32位二进制形式(4个字节,每个字节8位)。2.计算网络地址IP地址AND子网掩码。3.计算子网掩码的反码(按位取反)。4.计算广播地址:网络地址OR子网掩码的反码。例如:IP地址:192.168.1.10->11000000.10101000.00000001.00001010子网掩码:255.255.255.0->11111111.11111111.11111111.00000000网络地址:192.168.1.0->11000000.10101000.00000001.00000000 (IP AND子网掩码)子网掩码取反:0.0.0.255 ->00000000.00000000.00000000.11111111广播地址:192.168.1.255->11000000.10101000.00000001.11111111 (网络地址OR子网掩码取反)用C语言实现:-将IP地址字符串子网掩码字符串转换为4个整数(每个字节一个整数)。-分别计算网络地址(每个字节:ip[i]& mask[i])。-计算子网掩码的反码(每个字节:~mask[i],注意转换为byte类型,避免符号扩展)。-计算广播地址(每个字节:network[i] |(~mask[i]),同样注意转换为byte类型)。注意:在C语言中,按位取反操作符~会将整数所有位取反,包括高位。因此,对于每个字节,我们取反后需要与0xFF进行与操作,以确保只保留最低8位(即一个字节)。具体步骤:1.使用sscanf将IP地址子网掩码字符串解析为4个整数(每个字节一个)。2.计算网络地址数组:network[i] =ip[i] &mask[i]。3.计算掩码反码数组:inverted_mask[i] =~mask[i]&0xFF(取反并截取低8位)。4.计算广播地址数组:broadcast[i] =network[i] |inverted_mask[i]。5.将广播地址数组格式化为字符串。代码示例:</think>### C语言实现:基于IP地址子网掩码计算子网广播地址 根据IP地址子网掩码计算广播地址的核心公式为: $$ \text{广播地址} = (\text{IP地址} \land \text{子网掩码}) \lor (\neg \text{子网掩码}) $$ 其中: - $\land$ 表示按位与操作 - $\lor$ 表示按位或操作 - $\neg$ 表示按位取反操作 #### 实现步骤: 1. **解析IP子网掩码**:将点分十进制格式转换为32位整数 2. **计算网络地址**:`IP & 子网掩码` 3. **计算主机位全1值**:`~子网掩码` 4. **计算广播地址**:`网络地址 | 主机位全1值` 5. **格式转换**:将32位整数转回点分十进制格式 #### 完整代码实现: ```c #include <stdio.h> #include <stdint.h> // 将点分十进制IP转换为32位整数 uint32_t ip_to_uint(const char* ip) { uint32_t a, b, c, d; sscanf(ip, "%u.%u.%u.%u", &a, &b, &c, &d); return (a << 24) | (b << 16) | (c << 8) | d; } // 将32位整数转换为点分十进制IP void uint_to_ip(uint32_t ip, char* buffer) { sprintf(buffer, "%u.%u.%u.%u", (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF); } // 计算广播地址 void calculate_broadcast(const char* ip_str, const char* mask_str, char* broadcast) { // 转换为32位整数 uint32_t ip = ip_to_uint(ip_str); uint32_t mask = ip_to_uint(mask_str); // 计算网络地址: IP AND 子网掩码 uint32_t network = ip & mask; // 计算广播地址: 网络地址 OR (NOT 子网掩码) uint32_t broadcast_addr = network | (~mask); // 转换回点分十进制 uint_to_ip(broadcast_addr, broadcast); } int main() { char ip[] = "192.168.1.100"; char mask[] = "255.255.255.0"; char broadcast[16]; calculate_broadcast(ip, mask, broadcast); printf("IP地址: %s\n子网掩码: %s\n广播地址: %s\n", ip, mask, broadcast); return 0; } ``` #### 示例输出: ``` IP地址: 192.168.1.100 子网掩码: 255.255.255.0 广播地址: 192.168.1.255 ``` #### 关键计算过程(以192.168.1.100/24为例): 1. **IP地址**: $192.168.1.100 \rightarrow 11000000.10101000.00000001.01100100$ 2. **子网掩码**: $255.255.255.0 \rightarrow 11111111.11111111.11111111.00000000$ 3. **网络地址**(IP AND 掩码): $11000000.10101000.00000001.00000000 \rightarrow 192.168.1.0$ 4. **掩码取反**(NOT 掩码): $00000000.00000000.00000000.11111111 \rightarrow 0.0.0.255$ 5. **广播地址**(网络地址 OR 掩码反码): $11000000.10101000.00000001.11111111 \rightarrow 192.168.1.255$ #### 注意事项: 1. 子网掩码必须是**连续1**的格式(如255.255.255.0有效,255.255.0.255无效)[^2] 2. 计算结果需验证是否符合A/B/C类地址规范[^3] 3. 当子网掩码为32位(255.255.255.255)时,广播地址等于IP地址本身
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值