这是将十六进制转换为十进制和将十进制转换为十六进制的两个函数。这仅适用于 IPv6 十六进制和 IPv6 整数表示(因此,对 IPv4 数字使用 ip2long() 和 long2ip())。从理论上讲,可以将 IPv4 点分符号数字转换为十六进制值并使用这些值,但这可能是矫枉过正。
这将:
- 将所有完整的 IPv6 数字转换为字符串化的 long int(最多 39 个字符,如果标志设置为 true,则左填充以便排序。
- 将字符串化的“long”转换回十六进制 IPv6 表示,必要时将填充保留为完整的 32 位十六进制字符串。如果适当的标志设置为真,则可以选择从右到左放置冒号。
这些可以修改以处理几乎任何长度的十六进制值或几乎任何长度的整数,并且可以相应地调整冒号和填充的位置。
十六进制转十进制
function bchexdec($hex,$padl)
// Input: A hexadecimal number as a String.
// Output: The equivalent decimal number as a String.
// - if padl==true then pad left to fill 39 characters for string sort
{
if (strlen($hex) != 39)
{
$hex = inet6_expand($hex);
if ($hex == false) return false;
}
$hex=str_replace(":","",$hex);
$dec = 0;
$len = strlen($hex);
for ($i = 1; $i <= $len; $i++)
{
$dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));
}
if ($padl==true)
{
$dec=str_pad($dec,39,"0",STR_PAD_LEFT);
}
return $dec;
}
十进制转十六进制
function bcdechex($dec,$colon)
// Input: A decimal as a String.
// Output: The equivalent hex value.
// - if $colon==true then add colons.
{
$hex = '';
// RFC 5952, A Recommendation for IPv6 Address Text Representation, Section 4.3 Lowercase specifies letters should be lowercase. Though that generally doesn't matter, use lowercase
// to conform with the RFC for those rare systems that do so.
do
{
$last = bcmod($dec, 16);
$hex = dechex($last).$hex;
$dec = bcdiv(bcsub($dec, $last), 16);
} while($dec>0);
$hex=str_pad($hex,32,"0",STR_PAD_LEFT);
// Add colons if $colon==true
if ($colon==true)
{
$hex=strrev($hex);
$chunks=str_split($hex,4);
$hex=implode(":", $chunks);
$hex=strrev($hex);
}
return $hex;
}
这是基于在很多地方找到的想法和示例,以及我自己对易于分类和易于存储的 IPv6 地址的需求。