java中IPv4地址与整型类型互转_与PHP & JavaScript互通

该博客提供了一个Java工具类,用于将IPv4地址转换为32位整型数字,以及反之转换。代码中包含了无符号整数的处理,确保高位符号的正确性。同时,提供了测试用例验证转换的正确性。

场景

部分PHP系统存储在数据库中的IP地址为ip2long的结果,Java系统需要与之交互,所以我们需要一个支持IP地址转换的工具类。

分析

1.IPv4地址可转换为一个32位整型的数字,

2.单纯移位操作会出现高位符号为负的情况需要转换

java代码:

package org.ybygjy.util;
 
/**
 * IPv4地址与整型类型互转
 * @author WangYanCheng
 * @version 2015年8月16日
 */
public class IPConvert {
	public static long ip2Long(String ipAddr) {
		String[] tmpIPData = ipAddr.split("\\.");
		int result = ((toUnsignedInt(Integer.parseInt(tmpIPData[0]))<< 24)
				| (toUnsignedInt(Integer.parseInt(tmpIPData[1])) << 16) 
				| (toUnsignedInt(Integer.parseInt(tmpIPData[2])) << 8) 
				| (toUnsignedInt(Integer.parseInt(tmpIPData[3]))));
		//无符号转换
		long rtnValue = toUnsignedLong(result);
		return rtnValue;
	}
	/**
	 * Int无符号转换
	 * @param intVal
	 * @return intVal
	 */
	private static int toUnsignedInt(int intVal) {
		int result = intVal & 0x7fff;
		if (intVal < 0) {
			result = result | 0x8000;
		}
		return result;
	}
	/**
	 * Long无符号转换
	 * @param longVal
	 * @return longVal
	 */
	private static long toUnsignedLong(long longVal) {
		//注意十六进制表示的变量类型为Long(L)
		long result = longVal & 0x07fffffffL;
		if (longVal < 0) {
			result = result | 0x080000000L;
		}
		return result;
	}
	/**
	 * 给定数值转换为对应的IP地址
	 * @param longValue
	 * @return
	 */
	public static String long2IP(long longValue) {
		int ip1 = (int) (longValue >> 24) & 0xff;
		int ip2 = (int) (longValue >> 16) & 0xff;
		int ip3 = (int) (longValue >> 8) & 0xff;
		int ip4 = (int) longValue & 0xff;
		return ip1 + "." + ip2 + "." + ip3 + "." + ip4;
	}
	/**
	 * 测试入口
	 * @param args
	 * @throws UnknownHostException
	 */
	public static void main(String[] args) {
		String[] ipArr = {"182.118.0.0", "10.1.7.106", "222.223.254.254"};
		for(int i = 0; i < ipArr.length; i++) {
			String ipAddr = ipArr[i];
			Long ipNumber = IPConvert.ip2Long(ipAddr);
			String ipStr = IPConvert.long2IP(ipNumber);
			System.out.println(ipNumber + "=>" + ipStr);
		}
	}
}

这个函数 `sfe_ipv4_notify_register()` 是用于 **注册 SFE(Software Forwarding Engine)IPv4 消息通知回调函数** 的接口。它的主要作用是允许外部模块(如 SFE Connection Manager)注册回调函数,以接收 SFE 发送的 IPv4 连接状态同步消息。 --- ### 📌 函数签名解释 ```c struct sfe_ctx_instance *sfe_ipv4_notify_register( sfe_ipv4_msg_callback_t one_rule_cb, sfe_ipv4_msg_callback_t many_rules_cb, void *app_data) ``` - **参数说明**: - `one_rule_cb`:单条规则(连接)状态同步的回调函数; - `many_rules_cb`:批量规则(连接)状态同步的回调函数; - `app_data`:回调函数执行时传入的上下文数据; - **返回值**:返回一个指向 SFE 上下文的指针 `sfe_ctx_instance`。 --- ### 📌 代码逐行解释 ```c struct sfe_ctx_instance_internal *sfe_ctx = &amp;__sfe_ctx; ``` - 获取 SFE 的全局内部上下文结构体 `__sfe_ctx`,所有状态和回调都保存在这里。 ```c spin_lock_bh(&amp;sfe_ctx-&gt;lock); ``` - 加自旋锁,保护上下文结构体在并发访问时的安全性; - `spin_lock_bh` 会禁止本地软中断,适用于中断上下文调用。 --- #### 🧩 注册单条规则回调 ```c if (one_rule_cb &amp;&amp; !sfe_ctx-&gt;ipv4_stats_sync_cb) { sfe_ipv4_register_sync_rule_callback(sfe_ipv4_stats_one_sync_callback); } rcu_assign_pointer(sfe_ctx-&gt;ipv4_stats_sync_cb, one_rule_cb); ``` - 如果用户传入了 `one_rule_cb` 回调,并且当前还没有注册,则调用 `sfe_ipv4_register_sync_rule_callback()` 注册一个内部包装的回调 `sfe_ipv4_stats_one_sync_callback`; - 然后使用 `rcu_assign_pointer()` 安全地将用户回调赋值给 `ipv4_stats_sync_cb`,以供后续调用。 --- #### 🧩 注册批量规则回调 ```c if (many_rules_cb &amp;&amp; !sfe_ctx-&gt;ipv4_stats_sync_many_cb) { sfe_ipv4_register_many_sync_callback(sfe_ipv4_stats_many_sync_callback); } rcu_assign_pointer(sfe_ctx-&gt;ipv4_stats_sync_many_cb, many_rules_cb); ``` - 同理,如果用户传入了 `many_rules_cb` 并且尚未注册,则注册内部包装的批量回调; - 然后将用户提供的 `many_rules_cb` 赋值给上下文结构体的 `ipv4_stats_sync_many_cb`。 --- #### 🧩 设置上下文数据 ```c sfe_ctx-&gt;ipv4_stats_sync_data = app_data; ``` - 保存用户传入的上下文数据,在回调函数中会传回给用户。 ```c spin_unlock_bh(&amp;sfe_ctx-&gt;lock); ``` - 解锁,允许其他线程/中断访问上下文。 ```c return SFE_CTX_TO_PUBLIC(sfe_ctx); ``` - 将内部上下文转换为对外可见的上下文结构体并返回。 --- ### 🧠 用途分析 - 该函数是 SFE 模块提供给外部模块(如 ECM)的注册接口; - 允许外部模块接收 SFE 内部发送的 IPv4 连接状态同步信息; - 支持两种回调: - 单条连接状态更新; - 批量连接状态更新; - 是 SFE 快速路径向慢速路径或用户空间同步连接状态的关键接口。 --- ### ✅ 总结回答 函数 `sfe_ipv4_notify_register()` 的作用是: - 注册 SFE IPv4 连接状态同步的回调函数; - 支持单条和批量连接状态更新; - 保存用户上下文数据; - 是 SFE 上层模块(如 ECM)通信的重要接口。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值