在 PHP 中,将数字 IP(即 IPv4 地址的 32 位整数表示)转换为常见的点分十进制格式,可以直接使用内置函数 long2ip()


基本用法


$ipInt = 2130706433; // 对应 127.0.0.1
echo long2ip($ipInt); // 输出:127.0.0.1

注意事项


整数范围long2ip() 接受一个 32 位无符号整数(0 ~ 4294967295)。如果传入的值超出此范围,会因截断或溢出产生意外结果。


有符号整数问题:在 32 位系统上,PHP 的整数可能是有符号的,若数字大于 2147483647,可能被视为负数。此时可以先用 sprintf('%u', $int) 将其转为无符号字符串再调用:


  $int = -1062731515; // 例如某些数据库存储的有符号值
echo long2ip(sprintf('%u', $int)); // 正确还原为 192.168.1.1

反向操作ip2long() 可将点分 IP 转为整数。


手动实现(备选)


若需了解底层原理,也可通过位运算实现:


function ipFromInt($int) {
return sprintf(
'%d.%d.%d.%d',
($int >> 24) & 0xFF,
($int >> 16) & 0xFF,
($int >> 8) & 0xFF,
$int & 0xFF
);
}

对于 IPv6


IPv6 的“数字”表示通常为十六进制字符串或二进制,转换需使用 inet_ntop() 配合 inet_pton(),但官方没有直接的整数转换函数。若为二进制数据:


$binary = inet_pton('2001:db8::1');
echo inet_ntop($binary); // 还原为 2001:db8::1

如果您的“数字 IP”特指 IPv6 的大整数,可使用 gmpbcmath 扩展处理,但转换较复杂,通常按需查阅文档。




总结:对于 IPv4,直接使用 long2ip() 即可;注意整数类型和范围即可轻松完成转换。