Inet ntop: примеры (PHP)

Преобразование сетевых адресов: функция inet_ntop
Раздел: Сетевые функции
inet_ntop(string $ip): string|false
Назначение и параметры функции inet_ntop

Функция inet_ntop преобразует упакованный двоичный IP-адрес (32-битный для IPv4 или 128-битный для IPv6) в его стандартное строковое представление, удобное для чтения человеком.

Использование функции необходимо при обработке сетевых данных, полученных в двоичном формате, например, из баз данных, системных вызовов или функций, таких как inet_pton.

Функция принимает один обязательный аргумент:

  • $ip (string) - строка, содержащая упакованный двоичный IP-адрес.

Возвращаемое значение:

  • Строка с представлением адреса (например, '192.168.1.1' или '2001:0db8:85a3::8a2e:0370:7334') в случае успеха.
  • Логическое значение false в случае ошибки, например, при передаче строки неверной длины.
Базовые примеры использования
Пример 1: Преобразование IPv4
$binary_ipv4 = inet_pton('192.0.2.1');
$result = inet_ntop($binary_ipv4);
echo $result;
192.0.2.1
Пример 2: Преобразование IPv6
$binary_ipv6 = inet_pton('2001:db8::1');
$result = inet_ntop($binary_ipv6);
echo $result;
2001:db8::1
Пример 3: Обработка ошибки
$invalid_binary = 'short';
$result = inet_ntop($invalid_binary);
var_dump($result);
bool(false)
Похожие функции в PHP
  • inet_pton - выполняет обратное преобразование: из строкового представления в двоичный формат. Используют в паре с inet_ntop для конвертации адресов.
  • long2ip - конвертирует 32-битное целое число (long integer) в строку IPv4. Устаревшая функция, не поддерживающая IPv6. inet_ntop является более современной и универсальной заменой.
  • ip2long - обратная функция к long2ip. Также работает только с IPv4.

Для работы с IPv6 и современного кода предпочтительнее использование inet_ntop/inet_pton.

Типичные ошибки
Передача строки неверной длины

Функция ожидает строку длиной 4 байта для IPv4 или 16 байт для IPv6.

$result = inet_ntop('abc');
var_dump($result);
bool(false)
Ожидание строки при ошибке

При неудаче функция возвращает false, а не строку с сообщением об ошибке.

$binary = false;
$result = inet_ntop($binary);
if ($result === false) {
    echo 'Преобразование не удалось.';
}
Преобразование не удалось.
Некорректный двоичный ввод

Передача произвольной бинарной строки, не соответствующей формату IP, может вернуть неожиданный, но валидный с точки зрения синтаксиса адрес.

$random_binary = "\x00\x00\x00\x00";
$result = inet_ntop($random_binary);
echo $result;
0.0.0.0
Изменения в версиях PHP

Функция inet_ntop была добавлена в PHP 5.1.0.

Начиная с PHP 5.3.0, функция стала возвращать false при передаче строки неверной длины, вместо генерации предупреждения (E_WARNING) и возврата null.

В PHP 7.0 и 8.0 не было внесено значительных изменений в поведение этой функции. Она остается стабильным инструментом для работы с сетевыми адресами.

Расширенные примеры
Пример 1: Обработка адреса из двоичного поля базы данных
Пример php
// Предположим, что IP хранится в BINARY(16) поле как IPv6.
// Для IPv4 старшие байты дополняются нулями.
$packedFromDB = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xC0\x00\x02\x01"; // ::FFFF:192.0.2.1
$readableIP = inet_ntop($packedFromDB);
echo $readableIP;
::ffff:192.0.2.1
Пример 2: Итерация по списку упакованных адресов
Пример php
$binaryAddresses = [
    inet_pton('10.0.0.1'),
    inet_pton('2001:db8::cafe'),
    inet_pton('8.8.8.8')
];
foreach ($binaryAddresses as $binAddr) {
    echo inet_ntop($binAddr), "\n";
}
10.0.0.1
2001:db8::cafe
8.8.8.8
Пример 3: Валидация ввода через двойное преобразование
Пример php
function validateIpString($ipString) {
    $binary = @inet_pton($ipString);
    if ($binary === false) return false;
    $convertedBack = inet_ntop($binary);
    // Сравнение для каноничности, особенно для IPv6
    return $ipString === $convertedBack;
}
$testIPs = ['192.168.1.1', '0200.200.000.001', '2001:db8::1', '2001:db8:0:0:0:0:0:1'];
foreach ($testIPs as $ip) {
    echo $ip, ': ', validateIpString($ip) ? 'Valid' : 'Invalid or non-canonical', "\n";
}
192.168.1.1: Valid
0200.200.000.001: Invalid or non-canonical
2001:db8::1: Valid
2001:db8:0:0:0:0:0:1: Invalid or non-canonical
Пример 4: Работа с адресами в смешанном формате (IPv4-mapped IPv6)
Пример php
$ipv4_mapped = inet_pton('::ffff:192.0.2.128');
$result = inet_ntop($ipv4_mapped);
echo $result;
::ffff:192.0.2.128
Аналоги в других языках

Inet ntop в Python

Используют модуль socket. Функция inet_ntop принимает два аргумента: семейство адресов и упакованный адрес.

import socket
packed_ipv4 = socket.inet_aton('192.168.1.1')
result = socket.inet_ntoa(packed_ipv4)
print(result)
packed_ipv6 = socket.inet_pton(socket.AF_INET6, '2001:db8::1')
result6 = socket.inet_ntop(socket.AF_INET6, packed_ipv6)
print(result6)
192.168.1.1
2001:db8::1
JavaScript (Node.js)

В Node.js используют модуль os или dns для работы с адресами, но прямой аналог inet_ntop отсутствует. Чаще применяют сторонние библиотеки или парсинг буфера.

Inet ntop в MySQL

Функция INET_NTOA преобразует числовое представление IPv4 в строку. Не поддерживает IPv6.

SELECT INET_NTOA(3232235777);
192.168.1.1

PHP inet_ntop function comments

En
Inet ntop Converts a packed internet address to a human readable representation