2

我找不到关于在 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(同时处理两者),而用于编写我的代码的这种信息似乎在网上大部分缺失或不清楚。

这么多类似的功能,它们之间有什么区别和细微差别?!

帮助?

4

0 回答 0