Inet pton: примеры (PHP)
inet_pton(string $ip): string|falseОписание функции inet_pton
Функция inet_pton в PHP преобразует IP-адрес из человекочитаемого строкового представления в упакованное двоичное представление. Она используется для работы с сетевыми адресами, особенно когда требуется сравнивать IP-адреса, хранить их в компактном виде или выполнять сетевые операции.
Функция принимает один обязательный параметр:
- ip (string) - IP-адрес в формате IPv4 или IPv6 в виде строки.
Возвращаемое значение: двоичная строка длиной 4 байта для IPv4 или 16 байт для IPv6. При ошибке возвращается false.
Примеры использования
$ipv4 = '192.168.1.1';
$result = inet_pton($ipv4);
echo bin2hex($result);c0a80101
$ipv6 = '2001:0db8:85a3:0000:0000:8a2e:0370:7334';
$result = inet_pton($ipv6);
echo bin2hex($result);20010db885a3000000008a2e03707334
$ipv6_short = '::1';
$result = inet_pton($ipv6_short);
echo bin2hex($result);00000000000000000000000000000001
$invalid = 'not.an.ip';
$result = inet_pton($invalid);
var_dump($result);bool(false)
Похожие функции в PHP
Выполняет обратное преобразование: из двоичного представления в строковое. Применяется вместе с inet_pton для двустороннего преобразования.
Работают только с IPv4 адресами, преобразуя их в целые числа и обратно. Менее эффективны для хранения, но удобны для числовых операций.
С фильтром FILTER_VALIDATE_IP проверяет корректность IP-адреса. Не преобразует адрес, но обеспечивает валидацию.
Типичные ошибки
$result = inet_pton('256.300.500.600');
if ($result === false) {
echo 'Некорректный IP-адрес';
}Некорректный IP-адрес
$binary = inet_pton('invalid');
echo strlen($binary); // Ошибка, если falseWarning: strlen() expects parameter 1 to be string, bool given
$ip1 = inet_pton('192.168.001.001');
$ip2 = inet_pton('192.168.1.1');
var_dump($ip1 == $ip2);bool(true)
Для точного сравнения лучше использовать оператор ===.
Изменения в последних версиях PHP
В PHP 8 функция inet pton не претерпела значительных изменений. Основное поведение сохранилось с предыдущих версий. В PHP 7 и 8 улучшена обработка ошибок для некорректных IPv6 адресов.
Не было внесено изменений, влияющих на работу функции.
Расширенные примеры
function compareIPs($ip1, $ip2) {
return inet_pton($ip1) === inet_pton($ip2);
}
echo compareIPs('192.168.01.001', '192.168.1.1') ? 'true' : 'false';true
function inIPv6Subnet($ip, $subnet, $prefix) {
$ipBin = inet_pton($ip);
$subnetBin = inet_pton($subnet);
$mask = str_repeat('f', $prefix / 4);
if ($prefix % 4) $mask .= dechex(15 << (4 - ($prefix % 4)));
$mask = hex2bin(str_pad($mask, 32, '0'));
return ($ipBin & $mask) === ($subnetBin & $mask);
}
echo inIPv6Subnet('2001:db8::1', '2001:db8::', 64) ? 'true' : 'false';true
$ip = '10.0.0.1';
$binary = inet_pton($ip);
// Для MySQL: использование типа VARBINARY(16)
$stmt = $pdo->prepare('INSERT INTO logs (ip) VALUES (?)');
$stmt->bindParam(1, $binary, PDO::PARAM_LOB);function getIPVersion($ip) {
$bin = inet_pton($ip);
if ($bin === false) return 'invalid';
return strlen($bin) === 4 ? 'IPv4' : 'IPv6';
}
echo getIPVersion('::1');IPv6
$ip = '192.168.1.1';
$binary = inet_pton($ip);
$in_addr = unpack('N', $binary);
// Для использования в socket_connect и подобных функцияхАналоги в других языках
Inet pton в Python
import socket
result = socket.inet_pton(socket.AF_INET, '192.168.1.1')
print(result.hex())c0a80101
В Python требуется явно указывать семейство адресов (AF_INET или AF_INET6).
Inet pton в Javascript
// Нет прямой функции, но для IPv4:
function inetPton(ip) {
return new Uint8Array(ip.split('.').map(Number));
}
console.log(inetPton('192.168.1.1'));Uint8Array(4) [ 192, 168, 1, 1 ]
Inet pton в MySQL
SELECT HEX(INET6_ATON('2001:db8::1'));20010DB8000000000000000000000001
INET6_ATON работает с обоими версиями IP, аналогично INET_ATON для IPv4.