Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Статья: Преобразование IP адресов
Форумы портала PHP.SU » Разное » Обсуждение статей » Статья: Преобразование IP адресов

Страниц (1): [1]
 

1. Champion - 02 Сентября, 2008 - 12:31:12 - перейти к сообщению
Хотел бы сказать пару слов о той статье:
-
Цитата:
В PHP 4 есть встроенные функции ip2long (аналог моей ip2int) и logn2ip, но они почему-то глючат (переводят ИП в отрицательные числа)

Это не глюк, просто тип int включает числа -2147483647..2147483648. А тип UNSIGNED INT имеет ту же мощьность, но все > 0. (кстати это и написоно в статье следующей же фразой Улыбка )
-Зачем столько писанины? Можно сделать всё в одной строчке:
1способ: $int_ip = hexdec( dechex( ip2long($str_ip) ) );
2способ: if ($int_ip < 0) $int_ip += 2*2147483648;

Пользуйтесь! так проще! Улыбка
(Добавление)
немного не правильно я написал: $int_ip = hexdec( dechex( ip2long($str_ip) ) );
Здесь $int_ip на самом деле будет не int, а double
2. pifon1989 - 02 Сентября, 2008 - 13:12:48 - перейти к сообщению
Насчёт статьи - да, пожалуй, непродуманные высказывания автор делал. Но.
Champion пишет:
1способ: $int_ip = hexdec( dechex( ip2long($str_ip) ) );

Зачем переводить из десятичной в шестнадцатиричную а потом обратно? 0.о
Отрицание отрицания даёт утверждение, законы элементарной логики, в школах сейчас проходят.
Что нам это даст?
3. Champion - 02 Сентября, 2008 - 13:29:34 - перейти к сообщению
pifon1989 пишет:
Насчёт статьи - да, пожалуй, непродуманные высказывания автор делал. Но.
Champion пишет:
1способ: $int_ip = hexdec( dechex( ip2long($str_ip) ) );

Зачем переводить из десятичной в шестнадцатиричную а потом обратно? 0.о
Отрицание отрицания даёт утверждение, законы элементарной логики, в школах сейчас проходят.
Что нам это даст?


Радость Это чудо-финт! смотри: функция ip2long($str_ip) вернет отрицательное число, если $str_ip > 128.0.0.0. после того, как мы это число переведем туда-сюда, оно превратится как раз в тот самый нужный нам положительный ip, но теперь уже типа double.
Попробуй, например var_dump(hexdec(dechex("-2147483645"))). Ты в браузере увидишь число 2147483651, во как!)))
(Добавление)
то, что после числа 2147483645 - это не смайл. ...2147483645))) ; Это 3 скбки и ;
4. pifon1989 - 03 Сентября, 2008 - 19:21:52 - перейти к сообщению
Эмн... может просто умножить на -1 xDD
И, к тому же, есть тут одна проблема... как я пойму где были точки? 0.о
21.474.83.645? 21.474.836.45? Может 214.748.364.5? Не понял
Собсно резонный вопрос: как и что тут вообще можно будет проверить?
Предположим, получу я IP как целое или double. И? Что дальше то делать с ним? По-моему вся операция в конечном итоге неюзабельна по определению...
Леонид Ильич пишет:
НафиГа козе бойан?
5. Джур - 04 Сентября, 2008 - 06:35:57 - перейти к сообщению
pifon1989 пишет:
Собсно резонный вопрос: как и что тут вообще можно будет проверить?

гхм... ну вообщето превращение IP в число удобно, если нужно проверить, пренадлежит ли IP определенному промежутку...

чего все вцепились в минус понять не могу.
6. Champion - 04 Сентября, 2008 - 08:53:35 - перейти к сообщению
Цитата:
где были точки? 0.о
21.474.83.645? 21.474.836.45? Может 214.748.364.5?

Нигде - это число double.
Цитата:
Предположим, получу я IP как целое или double. И? Что дальше то делать с ним? По-моему вся операция в конечном итоге неюзабельна по определению...

1-сколько весит строка 12 символов и сколько double? (это не стеб. представь себе 20Гб-ю БД)
2-строка сортируются по алфавиту, т.е. 89.12.12.12 > 127.0.0.1. И сортировка строк медленнее.
3-
Цитата:
гхм... ну вообщето превращение IP в число удобно, если нужно проверить, пренадлежит ли IP определенному промежутку...

Цитата:
чего все вцепились в минус понять не могу
.
1-В БД обычно для этого дела use-ся беззнаковый тип. Т.е. переведешь ты ip так средствами php, составишь запрос найти ip<0, и облом.
2-скажем, надо тебе проверить, пренадлежит ли ip диапозону 127.0.0.1-128-5.5.5. Второе чило будет отрицательное, первое положительное. Ну или внести такой диапозон в БД (каждый ip - своя запись) ($i = 245...; $i < -234...; $i++), как видишь не даст того, чего хотелось бы
Цитата:
Эмн... может просто умножить на -1 xDD

потому что просто число противоположного знака никому не нужно. Нужно вот чего. Возьмем 4разрядовое 2ное число: 1110. Это 14. Но это и -2. Вот из -2 надо сделать 14. Если к примеру тип А имеет 4 разряда, а тип Б 5 то это число в памяти будет представленно соответсявенно 1110 (-2) и 01110 (14). Потому что старший разряд определяет знак.
Вот собственно это я и делаю, когда перевожу int в 16ричную систему, а потом обратно. После того как первел обратно, получается число double...
Цитата:
Леонид Ильич пишет:
Цитата:
НафиГа козе бойан?


Не знаю)
7. EuGen - 05 Сентября, 2008 - 09:32:48 - перейти к сообщению
Делаем:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function ip2int($ip)
  4. {
  5.         $rgIp=explode(".", $ip);
  6.         if ($rgIp[0]>=0 && $rgIp[0]<256 && $rgIp[1]>=0 && $rgIp[1]<256 && $rgIp[2]>=0 && $rgIp[2]<256 && $rgIp[3]>=0 && $rgIp[3]<256)
  7.                 return $rgIp[3]+($rgIp[2]<<8)+($rgIp[1]<<16)+($rgIp[0]<<24);
  8.         else
  9.                 return 0;
  10. }
  11.  
  12. function int2ip($int)
  13. {
  14.         $p[0]=($int>>24) & 0xff;
  15.         $p[1]=($int>>16) & 0x00ff;
  16.         $p[2]=($int>>8) & 0x0000ff;
  17.         $p[3]=$int & 0x000000ff;
  18.         return join('.', $p);
  19. }
  20. ?>
  21.  

И радуемся жизни

 

Powered by ExBB FM 1.0 RC1