我找不到关于在 PHP 中操作 128 位二进制(IPv6 IP)和混合 IPv4/IPv6 的最佳实践和替代方案的明确答案。
我正在寻找清晰的信息,所以我不会不小心在我的代码中写入细微的错误,在 IPv6 上下文中使用哪些函数(在我见过的许多函数中),以及(不)依赖什么. 例如:
IPv6 可以通过 inet_pton() 和 Net_IPv6 库(_bin2Ip、_Ip2bin)进行操作。我已经看到它们显式转换为二进制(PHP 5.4 之前)(二进制)inet_ntop(),但不知道这是否重要,使用打包/解包进行操作,并通过正常的按位操作 ($ip | ~ $mask) 和扩展数学进行操作(GMP 按位处理)。其中一些适用于 IPv4(例如 inet_pton)。
我已经 RTFM 了,但找不到关于 IPv6 IP 处理细节的明确提示和信息。
- 在不同情况下可能会使用哪种转换功能或处理方式?
- 这些功能中哪些实际上是相同的?
- 哪些保证产生可以与 > == < 比较的数据或不会溢出 PHP_INT_MAX?
- inet_pton() 是否有保证的字节顺序(大/小端)以允许 IP ><= 比较?(如果不是最好的方法是什么 - 将两者都转换为二进制字符串?)
- 我还看到使用 ip2long($ip) 和 (int)sprintf('%u', ip2long($ip)) 操纵 IPv4,但不清楚为什么一个可以工作而另一个不行(上下文更可能是 x32 而不是 x64)
我正在尝试将 IPv4 处理代码扩展到 IPv4/IPv6(同时处理两者),而用于编写我的代码的这种信息似乎在网上大部分缺失或不清楚。
这么多类似的功能,它们之间有什么区别和细微差别?!
帮助?