PHP:将in_addr解压缩为int的字符串表示形式

时间:2011-08-03 20:12:44

标签: php

inet_pton函数在其打包的in_addr表示中返回一个IP地址,即:: 1变为``。如何将此16字节值转换为整数? (好吧,整数的字符串表示。)

3 个答案:

答案 0 :(得分:2)

Matty,似乎应该在unpack()函数中使用大写字母“A”,否则如果它们为空,则会丢失最后4位:

$unpacked = unpack('a16', $in_addr);

2001:将0db8:11A3:09d7:1f34:8a2e:07a0:7600 转换为字符串(120)

$unpacked = unpack('A16', $in_addr);

2001:将0db8:11A3:09d7:1f34:8a2e:07a0:7600 转换为字符串(128)

this解决方案也可用于相同的转换结果。

答案 1 :(得分:1)

以下代码执行此操作:

$in_addr = inet_pton('21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A');
$unpacked = unpack('a16', $in_addr);
$unpacked = str_split($unpacked[1]);
$binary = '';
foreach ($unpacked as $char) {
    $binary .= str_pad(decbin(ord($char)), 8, '0', STR_PAD_LEFT);
}

$gmp = gmp_init($binary, 2);
$str = gmp_strval($gmp);

您还可以使用以下代码对其进行反转:

$gmp = gmp_init($str);
$binary = gmp_strval($gmp, 2);
$binary = str_pad($binary, 128, '0', STR_PAD_LEFT);

$binary_arr = str_split($binary, 8);
$packed = '';
foreach ($binary_arr as $char) {
    $packed .= chr(bindec($char));
}

$packed = pack('a16', $packed);
echo inet_ntop($packed);

答案 2 :(得分:0)

您不能精确地在PHP数字中表示16字节(128位)整数 - 它们通常存储为双精度数,在此之前会丢失精度。以下是如何在不使用GMP的情况下将一个打包为四个32位整数的方法:

$in_addr = inet_pton('2001:0db8:85a3:0000:0000:8a2e:0370:7334');
list($junk, $a, $b, $c, $d) = unpack("N4", $in_addr);
printf("%08x %08x %08x %08x", $a, $b, $c, $d);

另请注意inet_ntop函数,该函数会将inet_pton的输出转换为人类可读的格式。