sdrobov / php-cidr
提供针对 IPv4 地址的几个有用功能
This package is auto-updated.
Last update: 2024-09-27 00:40:50 UTC
README
提供针对 IPv4 地址的几个有用功能。它主要使用位运算表达式实现,因此可以轻松地移植到其他语言。错误检查的工作量非常小。在注释块中声明了引用。
简介
对于一个中型项目,我想在数据库中存储 IP 范围,并可选择存储 CIDR 块。CIDR 块功能强大,但对普通用户来说有些难以使用。使用它们并不总是对所有 IP 范围都精确。互联网上有许多 工具 可以实现我所期望的功能。然而,将这些工具集成到项目中并不实用。我想要的只是模仿这些工具的功能,以便可以轻松地将其导入到我的任何项目中。对我来说最有价值的功能是将 IP 范围转换为精确的 CIDR 块范围。这需要特定的功能,而这些功能在 PHP 中并不自然提供。
- 检查有效子网掩码
- 检查 IP 地址是否在 CIDR 块内。
- 接收用户输入和一个子网掩码,并将其转换为有效的 CIDR 块。
- CIDR 号码转换为子网掩码
- 子网掩码转换为 CIDR
- 将 IP 范围放入精确的 CIDR 块范围。
这带来了一些困难,因为 PHP 的 [网络函数] phpnetwork 并不全面。当我意识到 IP 地址仅仅是一个数字时,这种启示出现了。事实上,整个协议都是基于二进制,使用非常特定的模式。考虑到这一点,我认为我们可以开发出非常轻量级的解决方案来解决这个问题。
代码
需要注意的是,提供的方法仅适用于 IPv4 地址,且仅在 32 位系统上进行了测试。此外,我没有花太多精力进行错误检查,但进行这样的检查,例如测试 CIDR 数字是否为无符号且小于或等于 32,应该是微不足道的。
尽管我寻求的解决方案需要 PHP,但我并没有限制自己只使用该语言。事实上,我找到的 PHP 代码似乎效率不高。大多数都涉及数字转换或使用循环和嵌套的 if 语句解析地址。实际上,最有效的代码,这不会让大多数人感到惊讶,是在 ANSI C 中。 位操作技巧 资源非常有用。
关于二进制
我并不试图教授二进制数学。由于代码并不“像散文一样”阅读,因此需要一些基本知识才能理解代码。一些优秀的资源包括维基百科上的 CIDR 文章和 PHP 二进制运算符。