inet_pton
函数在其打包的in_addr表示中返回一个IP地址,即:: 1变为``。如何将此16字节值转换为整数? (好吧,整数的字符串表示。)
答案 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
的输出转换为人类可读的格式。