通常,我们看到的 IP 地址格式是类似 192.168.1.1 的点分十进制格式。但有时,IP 地址会被表示成连续的十六进制字符串,例如:
C0A80101
这其实就是 192.168.1.1 四个字节的十六进制表达。
每两位十六进制数表示 IP 地址中的一个字节(8位),例如:
C0 = 192
A8 = 168
01 = 1
01 = 1
PHP 内置的 hexdec 函数可以将十六进制字符串转换为十进制数字。但要注意,它转换的是整体数字,无法直接用来转换点分四段的十六进制 IP 地址,因此我们需要先将十六进制字符串按两位拆分,再转换为十进制数。
下面的脚本展示如何用 PHP 把一个连续的 8 位十六进制 IP 地址转换成点分十进制格式:
<?php
function hexIpToDecimal($hexIp) {
// 将输入的字符串转换为大写,保证统一格式
$hexIp = strtoupper($hexIp);
// 检查长度是否正确(IPv4 是 8 位十六进制)
if (strlen($hexIp) !== 8) {
return false; // 输入格式错误
}
$ipParts = [];
// 每两位一组,转换为十进制
for ($i = 0; $i < 8; $i += 2) {
$partHex = substr($hexIp, $i, 2);
$partDec = hexdec($partHex);
$ipParts[] = $partDec;
}
// 拼接成点分格式
$decimalIp = implode('.', $ipParts);
return $decimalIp;
}
// 测试示例
$hexIp = "C0A80101";
$decimalIp = hexIpToDecimal($hexIp);
echo "十六进制IP: $hexIp 转换后为: $decimalIp\n";
?>
运行结果:
十六进制IP: C0A80101 转换后为: 192.168.1.1
输入检查
函数首先确保传入的十六进制字符串是 8 位长(对应 IPv4 的 4 个字节)。
分段处理
利用 substr 每次取两位字符,代表一个字节。
转换十六进制为十进制
用 hexdec 函数将两位十六进制字符串转换为十进制数。
格式拼接
将转换后的四个十进制数字用点号连接,生成常见的点分十进制 IP 地址。
如果你遇到的十六进制 IP 地址是带分隔符的,比如 C0:A8:01:01,可以先去掉分隔符再用上述方法处理:
$hexIp = str_replace(':', '', 'C0:A8:01:01');
$decimalIp = hexIpToDecimal($hexIp);
echo $decimalIp; // 输出:192.168.1.1
通过以上方法,使用 PHP 的 hexdec 函数就可以轻松地将十六进制表示的 IP 地址自动转换成我们熟悉的十进制点分格式。希望这篇文章对你有所帮助!