Что такое код ip2long


Что такое код ip2long

ip2long — конвертирует строку, содержащую адрес (IPv4) Internet Protocol, в подходящий адрес.

Описание

int ip2long (string ip_address)

Функция ip2long() генерирует IPv4 Internet сетевой адрес из стандартного представления в Internet-формате (строки с точками).

Пример 1. ip2long()

$out .= «http://www.example.com/, http://».$ip.»/, and http://».sprintf(«%u»,ip2long($ip)).»/
\n»; echo $out; ?>

Примечание: поскольку PHP-тип integer является знаковым, а многие IP-адреса дают отрицательные целочисленные значения, вам необходимо использовать форматировщик «%u» sprintf() или printf() для получения строкового представления беззнаковых IP-адресов.

Что такое код ip2long

На php есть функция long2ip для преобразования десятичного формата IP адреса в 4-х байтный.
Есть ли такая функция на perl?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Оглавление

  • аналог функции long2ip, butcher, 10:42 , 26-Июл-05, (1)
    • аналог функции long2ip, DenisK, 10:57 , 26-Июл-05, (2)
      • аналог функции long2ip, Simps, 11:04 , 26-Июл-05, (3)
      • аналог функции long2ip, butcher, 11:07 , 26-Июл-05, (4)
      • аналог функции long2ip, rWizard, 11:10 , 26-Июл-05, (5)
      • аналог функции long2ip, chip, 18:41 , 26-Июл-05, (7)
  • аналог функции long2ip, ihor, 11:25 , 26-Июл-05, (6)
    • аналог функции long2ip, Виталий email vp7mail.ru, 16:20 , 23-Янв-07, ( 8 )

Сообщения по теме [Сортировка по времени, UBB]

>На php есть функция long2ip для преобразования десятичного формата IP адреса в
>4-х байтный.
>Есть ли такая функция на perl?

1. «аналог функции long2ip»
Сообщение от butcher (ok) on 26-Июл-05, 10:42
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. «аналог функции long2ip»
Сообщение от DenisK on 26-Июл-05, 10:57

>>На php есть функция long2ip для преобразования десятичного формата IP адреса в
>>4-х байтный.
>>Есть ли такая функция на perl?
>
>inet_ntoa

она не пашет
=============
#!/usr/bin/perl
use Socket;
$ip = inet_ntoa (174073896);
print $ip;
================
результат:
Bad arg length for Socket::inet_ntoa, length is 9, should be 4 at ./bill.pl line 3.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. «аналог функции long2ip»
Сообщение от Simps (ok) on 26-Июл-05, 11:04

>>>На php есть функция long2ip для преобразования десятичного формата IP адреса в
>>>4-х байтный.
>>>Есть ли такая функция на perl?
>>
>>inet_ntoa
>
>она не пашет
>=============
>#!/usr/bin/perl
>use Socket;
>$ip = inet_ntoa (174073896);
>print $ip;
>================
>результат:
>Bad arg length for Socket::inet_ntoa, length is 9, should be 4 at
>./bill.pl line 3.

Все работает .
#!/usr/bin/perl
use Socket;
$ipl = inet_aton(«192.168.0.2»);
$ip = inet_ntoa ($ipl);
print «$ip\n»;

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. «аналог функции long2ip»
Сообщение от butcher (ok) on 26-Июл-05, 11:07

>результат:
>Bad arg length for Socket::inet_ntoa, length is 9, should be 4 at
>./bill.pl line 3.

Используйте функцию pack

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. «аналог функции long2ip»
Сообщение от rWizard (ok) on 26-Июл-05, 11:10

Для преобразования в числовой формат
(не знаю как его назвать, но его использует mysqld [кстати там есть встроенная возможность преобразования])
встроенных функций нет, но есть:

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. «аналог функции long2ip»
Сообщение от chip (ok) on 26-Июл-05, 18:41

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

sub ip2long <
return unpack(«N»,inet_aton(shift));
>

sub long2ip <
return inet_ntoa(pack(«N»,shift));
>

Используется в моих скриптах, проверено на калькуляторе — великолепно работает :)

Как в mysql лучше всего хранить ip адрес?

Как в mysql лучше всего хранить ip адрес? Varchar или int? По вашему мнению, бывают ли ситуации, когда нужно производить поиск по ip адресам, например ip > 127.0.0.1. Какие функции преобразование ip адреса есть в MySQL, а какие есть в php? Равнозначны ли они?

6. «аналог функции long2ip»
Сообщение от ihor on 26-Июл-05, 11:25

while (scalar(@res) 8 . «аналог функции long2ip»

Сообщение от Виталий email vp7mail.ru on 23-Янв-07, 16:20
34.82.173.165
– anonymous месяц назад

1 ответ

Наиболее удобно ip-адрес в MySQL хранить в типе INT. Причём обязательно UNSIGNED (беззнаковый), чтобы адреса выше 127. вполне вмещались в эти 4 байта.

Тип INT более удобен для хранения ip-адресов по сравнению с CHAR(15) по двум причинам:

  1. Требует меньше памяти (4 байта INT против 15 байт CHAR). Как результат, таблица занимает меньше места на диске, а скорость выполнения запросов возрастает, т.к. индекс меньшего размера.
  2. Удобно производить выборки по диапазонам адресов и маскам, а также делать сортировку (получается обычная сортировка по числам).

Имеется недостаток по сравнению с хранением ip как plaintxt (char или varchar) в mysql:

  1. Необходимость дополнительного преобразования ip-строки в число и наоборот для удобства восприятия. Для чего используются функции INET_ATON и INET_NTOA (см. дальше). Но это ведь не проблема.

Как видно, достоинства хранения ip в UNSIGNED INT сильно превосходят единственный недостаток.

Функции преобразования ip-адреса в mysql:

  1. INET_ATON() — для преобразования IP адреса в число,
  2. INET_NTOA() — для обратного преобразования числа в IP адрес.

Для простоты запоминания нужно знать расшифровку аббревиатуры:

  • ATON — Address TONumber (адрес в число),
  • NTOA — Number TO Address (число в адрес).

Примеры преобразования IP в mysql:

Аналогичные функции преобразования ip-адреса в PHP:

  1. ip2long() — для преобразования IP адреса в число;
  2. long2ip() — для обратного преобразования числа в IP адрес.

Задача. Нам нужно получить все записи, которые находятся в диапазоне адресов 148.100.0.0 — 158.255.255.255. Если хранить IP в виде строк, то пришлось бы производить поиск с помощью регулярных выражений, а запрос выполнялся бы очень долго.

В случае хранения IP-адреса в типе INT sql-запрос будет таким:

Постилка

вторник, 5 февраля 2013 г.

PHP: особенности функции ip2long

Думаю, большинство программистов встречались с задачей хранения ip в БД. Хранить их как plain text (например, 127.0.0.1) неудобно и непрактично. Потому принято использовать функцию ip2long, которая преобразовывает ip адрес в целове число.

Но есть некоторые особенности ее использования в x32/x64. Допустим, для его хранения мы выделяем INT ячейку в БД.

Результат функции на x32:
ip2long(127.127.127.127) = 2147483648
ip2long(255.255.255.255) = -2147483648

Результат функции на x64:
ip2long(127.127.127.127) = 2147483648
ip2long(255.255.255.255) = 4294967296

Получается что 4294967296 не запишется в БД, так как ячейка в нашей БД типа INT и максимальное число, которое можно в нее записать: 2147483648.

Потому добавляем для атрибут UNSIGNED, который позволяет записывать в БД диапазон чисел от 0 до 4294967296.

Но как же быть с x32? Ведь в ней функция ip2long может вернуть отрицательное значение. Для решения этой проблемы нужно обрабатывать результат перед записью БД:

ip2long, long2ip — какого черта.

tony2001

TeaM PHPClub

ip2long, long2ip — какого черта.

Имеется РНР версии 4.0RC1, под Юнихом.
Имеются также функции ip2long, long2ip.

КАКОГО ЧЕРТА long2ip конвертит IP-шник, перевернутым задом наперед (т.е., как «1.3.168.192» вместо того, чтобы конвертить его как «192.168.3.1&quot .

ip2long, похоже, читает точно так же — из перевернутого наоборот формата.

Мне надо прочитать IP-шники, конвертнутые с помощью Перла — ессно, получается полный бред.

Может кто-то что-нибудь посоветует, а ?

tony2001

TeaM PHPClub

беру IP = «192.168.3.22»;

перевожу поотдельности в HEX.

получаю: c0a80316 (подставляю нолик к тройке..ну неважно. )

беру в руки калькулятор из Виндов: в DEC это же равно «3232236310».

теперь тоже самое, но с помощью hexdec: «-1062730986»

чтобы это значило.

tony2001

TeaM PHPClub

и на том спасибо!

положился, блин, на РНР.
hexdec, dechex, ip2long, long2ip, слова-то какие . эх.
а оказалось оффтопик сторе. =(
сэнкс.

php.spb.ru

tony2001

TeaM PHPClub

Дело в общем-то было не только в том, что у меня разные результаты были на локальной машине и на сервере (hexdec на сервере не понимал отр. значение, а локальной было все ок.), дело было еще в том, что я рассчитывал на _нормальную работу_ функций ip2long & long2ip — неважно отрицательный / положительный результат — главное, что работает НЕ ТАК, КАК НАДО.

Ну ладно, спасибо родному оффтопик стору — проблема решена =))

DiMA писал(а):
——————————-
при переводе ИП в число хоть тресни, а должно вылезать положительное число. Почему? Дык, именно этого люди ждут. А то, что кто-то может хранить ИП не числом, а в каком-то другом формате — никто не против

Аналог ip2long и long2ip в Java

Как в Java реализовать методы по преобразованию ip в long и обратно, как ip2long и long2ip функции в php?

2 ответа 2

Для преобразования ip в long по аналогии ip2long , создайте метод ipToLong() с принимаемым параметром типа String . Пример принимаемой строки: «192.168.1.1» .

Для обратного преобразования long в ip по аналогии long2ip , создайте метод longToIp() с принимаемым параметром типа long . Пример принимаемого параметра: 3232235777 .

В первом методе строка с ip разбивается на массив из четырех чисел. Затем числа перемножаются на 256 возведенное в степень 3, 2, 1, 0 соответственно для каждого числа. Сумма чисел после проведенных операций long полученного ip .

Во втором методе для преобразования long обратно в ip используется побитовый сдвиг принимаемого long . Принимаемый long поочередно сдвигается на 24, 16, 8 бит соответственно, для последнего числа сдвиг не требуется, после чего биты преобразуются в соответствии логического оператора & с байтом 0xFF .

IP диапазоны

Видео: IP диапазоны

Как быстро и просто определить диапазон IP с помощью PHP?

Мы часто встречаем ситуации, когда необходимо работать с диапазонами IP адресов. Это могут быть поисковые системы, боты, которые атакуют сайт или просто обычные пользователи с определенными IP-диапазонами. Что же делать, когда необходимо узнать принадлежит ли конкретный IP конкретному посетителю или боту сайта?

На самом деле код очень короткий и простой, как капля чистой воды. Все, что тебе необходимо — умение редактировать текстовые файлы. И так, открывай любой текстовый документ, мы начинаем работать.

Как тебе известно, любой PHP код начинается с:

так что, открывай текстовый редактор и поехали дальше.

Для определения диапазона IP нам потребуется создать один раз функцию, которая бы собственно и давала результат true или false в зависимости от определенных условий.

Например, назовем эту функцию proverkaip. Все диапазоны IP будут лежать у нас в массиве. Далее, мы конвертируем при помощи ip2long IP адреса стандартные (например 192.168.0.1) в те, которые не содержат точек — получится (из 192.168.0.1) 3232235521. Таким образом, мы сможем сравнить диапазоны IP адресов.

Как видишь, небольшой код может сэкономить твое время, ресурсы твоего хостинга или сервера. После диапазона IP идет присвоение функции $iptolong IP адреса клиента, который конвертируется с использованием ip2long функцией PHP. Далее в цикле (foreach) мы перелопачиваем массив данных и сравниваем его с IP адресом клиента. Если совпадения есть, то функция возвращает true.

Например, у тебя диапазон IP 192.0.0.0 — 195.0.0.0, адрес, который будет иметь цифры 194.168.250.254 с использованием вышеупомянутой функции возвратит true. Т.е. он будет в диапазоне проверяемых тобой IP адресов.

Пример работы кода:

Вот и все. Еще один совет. Используй Notepad++, если тебе необходимо сделать из трехсот строк (например) разных диапазонов IP массивы. Пример:

У тебя есть диапазоны:

то необходимо, открыв Notepad++, поставить каретку в конец первой строки (где написано 192.168.255.255), далее зажать Shift и нажимать стрелку вправо, пока каретка не остановится перед цифрой 195 (именно перед 195.1.1.2), на следующей строке. После этого жми Crtl+H. У тебя появится автозамена. В поле «Найти» у тебя уже будут непонятные символы, не обращай внимания, в поле «Заменить на:» поставь ‘),\n array(‘ ЗАТЕМ внизу (режим поиска) нажми «Расширенный», нажми Заменить все. Далее замени ПРОБЕЛ-ПРОБЕЛ > ( — ) на ‘, ‘ (знак апострофа запятая ПРОБЕЛ знак апострофа). После чего в самом начале кода поставь array(‘, так как там не произошла автозамена и в конце поставь ‘) (апостроф и скобка закрывающая).

Что такое код ip2long

ip2long — Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address

Description int ip2long ( string ip_address )

The function ip2long() generates an IPv4 Internet network address from its Internet standard format (dotted string) representation. If ip_address is invalid then -1 is returned. Note that -1 does not evaluate as FALSE in PHP.

Замечание: As of PHP 5.0.0 ip2long() returns FALSE when ip_address is invalid.

Пример 1. ip2long() Example

= gethostbyname ( ‘www.example.com’ );
$out = «The following URLs are equivalent:
\n» ;
$out .= ‘http://www.example.com/, http://’ . $ip . ‘/, and http://’ . sprintf ( «%u» , ip2long ( $ip )) . «/
\n» ;
echo $out ;
?>

Замечание: Because PHP’s integer type is signed, and many IP addresses will result in negative integers, you need to use the «%u» formatter of sprintf() or printf() to get the string representation of the unsigned IP address.

This second example shows how to print a converted address with the printf() function in both PHP 4 and PHP 5:

Пример 2. Displaying an IP address

if ( $long == — 1 || $long === FALSE ) <
echo ‘Invalid IP, please try again’ ;
> else <
echo $ip . «\n» ; // 192.0.34.166
echo $long . «\n» ; // -1073732954
printf ( «%u\n» , ip2long ( $ip )); // 3221234342
>
?>

ip2long() should not be used as the sole form of IP validation. Combine it with long2ip() :

Пример 3. IP validation

// make sure IPs are valid. also converts a non-complete IP into
// a proper dotted quad as explained below.
$ip = long2ip ( ip2long ( «127.0.0.1» )); // «127.0.0.1»
$ip = long2ip ( ip2long ( «10.0.0» )); // «10.0.0.0»
$ip = long2ip ( ip2long ( «10.0.256» )); // «10.0.1.0»
?>

Замечание: ip2long() will return FALSE for the IP 255.255.255.255 in PHP 5 -1 (same as PHP 4).

Пред. Начало След.
inet_pton Уровень выше long2ip

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Справочник по PHP : Файлы и сети : Сетевые функции

Материал из WebWikiABCD

Содержание

ip2long

Производит конвертацию строки адреса IPv4 в число.

Функция ip2long() возвращает четырех байтовое численное представление адреса IP v4 из строки (числа, разделенные точками, например: «127.0.0.1»).

long2ip

Производит конвертацию числа в строку адреса IP v4.

Функция long2ip() возвращает строковое представление IP-адреса (в формате: «aaa.bbb.ccc.ddd») из численного представления.

gethostbyaddr

Возвращает имя хоста, который соответствует заданному IP-адресу.

Функция gethostbyaddr() возвращает доменное имя хоста, заданного своим IP-адресом. В аргументе указывается адрес IP в строковом формате. В случае ошибки возвращает ip_address.

Надо отметить, что функция не гарантирует, что полученное имя на самом деле будет соответствовать действительности. Она лишь опрашивает хост по адресу ip_address и просит его сообщить свое имя. Владелец хоста, таким образом, может передавать все, что ему заблагорассудится.

gethostbyname

Возвращает IP-адрес хоста.

Функция gethostbyname() получает в параметрах доменное имя хоста и возвращает его IP-адрес. Если адрес определить не удалось, функция возвращает hostname.

gethostbynamel

Возвращает список IP-адресов хоста.

Одному доменному имени может соответствовать сразу несколько IP-адресов, и в случае сильной загруженности серверов DNS-сервер сам выбирает, по какому IP-адресу перенаправить запрос. Он выбирает тот адрес, который использовался наиболее редко.

Функция gethostbynamel() возвращает не один, а все IP-адреса хоста с именем hostname.

Стоит заметить, что в Интернете существует множество виртуальных хостов, которые имеют различные доменные имена, но один и тот же IP-адресс. Таким образом, если следующая последовательность команд для существующего хоста с IP-адресом ip всегда печатает этот же адрес:

то аналогичная последовательность для домена с DNS-именем $host, наоборот, может напечатать не то же имя, а другое:

getprotobyname

Производит определение номера порта, используемого протоколом.

getprotobynumber

Производит определение протокола порта.

getservbyname

Производит определение протокола интернет-службы.

Эта функция возвращает номер порта, который использует служба service.

В аргументе protocol указывается тип протокола — TCP или UDP.

getservbyport

Производит определение интернет-службы, которая использует заданный порт.

Здесь в аргументе protocol нужно указать тип протокола — TCP либо UDP.

checkdnsrr

Производит проверку записи DNS.

Эта функция отправляет запрос DNS-серверу для поиска записей, которые имеются для хоста host. Если были найдены записи типа type, то функция возвращает true. В противном случае и при ошибке — false.

Аргумент typeможет принимать значения:

Аргумент host может указываться строкой в формате IP с разделением точками, либо быть именем хоста.

getmxrr

Производит получение MX записи для интернет-хоста.

Функция getmxrr() инициирует поиск в базе данных DNS записи MX (почтовый сервер домена) для хоста hostname.

Если запись найдена, возвращает true, если нет — то false.

Список записей MX заносится в массив mxhosts. Если указан массив weight, он заполняется дополнительной информацией о записях.

ip2long INET_ATON() и INET_NTOA() в PHP?

iptolong (5)

ip2long эквивалентно inet_aton ().

ip2long работает только с IPv4. Я подозреваю, что ваша система использует IPv6 для loopback. Попробуйте распечатать REMOTE_ADDR.

Я хочу хранить IP-адреса в своей базе данных, но мне также нужно использовать их во всем приложении. Я прочитал об использовании INET_ATON() и INET_NTOA() в моих MySQL-запросах, чтобы получить 32-разрядное целое число без знака из IP-адреса, что именно то, что я хочу, так как это сделает поиск по базе данных быстрее, чем использование char (15) ,

Дело в том, что я не могу найти функцию, которая делает то же самое в PHP. Единственное, с чем я столкнулся, это:

Поэтому я протестировал его:

И он ничего не выводит. В примере, который они дали, похоже, он работает, но опять же я не совсем уверен, что ip2long() делает то же самое, что и INET_ATON() .

Кто-нибудь знает функцию PHP, которая сделает это? Или даже совершенно новое решение для хранения IP-адреса в базе данных?

Здесь PHP альтернативные функции (простая копия / вставка в вашей программе) —

Для поддержки IPv4 и IPv6 используйте inet_pton() и inet_ntop() , они доступны с PHP 5.1+ и точно имитируют эквивалентные функции MySQL.

В противном случае просто используйте ip2long() и long2ip() .

Существует важное различие между ip2long , long2ip и MySQL.

PHP ip2long и long2ip сделки со long2ip целыми числами.

«Поскольку целочисленный тип PHP подписан, а многие IP-адреса приведут к отрицательным целым числам на 32-разрядных архитектурах, вам нужно использовать форматирование ‘% u’ из sprintf () или printf (), чтобы получить строковое представление неподписанного IP-адреса адрес.»

В INET_ATON() и INET_NTOA() MySQL INET_ATON() целые числа без знака

«Чтобы хранить значения, созданные INET_ATON (), используйте столбец INT UNSIGNED, а не INT, который подписан. Если вы используете столбец с подписью, значения, соответствующие IP-адресам, для которых первый октет больше 127, нельзя сохранить правильно».

Вот некоторые функции, которые вы можете использовать для работы между ними.

Если вы вставили в базу данных MySQL, IP используя INET_ATON() , вы можете преобразовать ее обратно в PHP, используя следующее:

И вы можете преобразовать его, чтобы сохранить его в базе данных из PHP, используя это:

(Также важно не вводить тип $ip_address в int как это может вызвать проблемы, обертывая число, если оно больше MAX_INT . Если вы должны его MAX_INT его в long или float )

Вы не должны иметь дело с тем, что внутри PHP, вот для чего нужны MySQL. См. Этот пример:

Если вы хотите иметь дело с ipv4 и ipv6 в одном поле, и вы используете Mysql 5.6 или выше, вы можете использовать varbinary (16) и функции inet6_aton и inet6_ntoa. Это лучший пример того, почему вы должны использовать функции MySQL и не иметь дело с двоичными данными внутри PHP:

Вы можете видеть, что, делая это, вы фактически можете избежать оценки адресов ipv6 в разных форматах, поскольку MySQL преобразует их в двоичные и обратно в их простое выражение.

Я знаю, что этот вопрос уже более двух лет, но я хочу, чтобы эта информация была полезной для других, которые сталкиваются.

Илон Маск рекомендует:  Что такое код pg_field_num
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL