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

PHP:将in_addr解包为int的字符串表示形式,php,Php,inet\u pton函数在其打包地址表示形式中返回一个IP地址,即:1变为“`”。如何将这个16字节的值转换为整数?(好的,整数的字符串表示。)下面的代码执行此操作: $in_addr = inet_pton('21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A'); $unpacked = unpack('a16', $in_addr); $unpacked = str_split($unpacked[1]); $binary = ''; foreach ($un

inet\u pton
函数在其打包地址表示形式中返回一个IP地址,即:1变为“`”。如何将这个16字节的值转换为整数?(好的,整数的字符串表示。)

下面的代码执行此操作:

$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);

以下代码将执行此操作:

$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);

不能用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\u pton的输出转换回人类可读的格式。

不能用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\u pton的输出转换回人类可读的格式。

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

$unpacked = unpack('a16', $in_addr);
2001:0db8:11a3:09d7:1f34:8a2e:07a0:7600 转换为字符串(120)

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


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

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

$unpacked = unpack('a16', $in_addr);
2001:0db8:11a3:09d7:1f34:8a2e:07a0:7600 转换为字符串(120)

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


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

我不知道
pack
unpack
函数。我确实需要一个GMP资源,因为我需要对结果数字进行一些位操作。这个答案帮助我想出了一个更优雅的解决方案——我已经修改了我的答案。谢谢我不知道
pack
unpack
功能。我确实需要一个GMP资源,因为我需要对结果数字进行一些位操作。这个答案帮助我想出了一个更优雅的解决方案——我已经修改了我的答案。谢谢