Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Может так паковать IP?
 
 автор: ~AquaZ~   (17.01.2010 в 18:59)   письмо автору
 
 

Достаточно строки из 4 знаков. Вот
<?
function ip2short(string $ip)
{
   if (!
preg_match('#([0-9]{1,3}\.){3}[0-9]{1,3}#'$ip)) return;
   
$ip explode('.'$ip);
   return 
chr((int)$ip[0]).chr((int)$ip[1]).chr((int)$ip[2]).chr((int)$ip[3]);
}
function 
short2ip(string $short)
{
   if (
strlen($short) != 4) return;
   return 
ord($short[0]).ord($short[1]).ord($short[2]).ord($short[3]);
}
По-моему разумно, ничего ни умножать, ни делить. Исправьте, если что не так.

  Ответить  
 
 автор: Саня   (17.01.2010 в 20:26)   письмо автору
 
   для: ~AquaZ~   (17.01.2010 в 18:59)
 

В чём разумность? Какие преимущества над ip2long()?

  Ответить  
 
 автор: ~AquaZ~   (17.01.2010 в 20:29)   письмо автору
 
   для: Саня   (17.01.2010 в 20:26)
 

Ненадо ничего возводить в степень и перемножать, а для раскодирования делить. Умещается в 4 знака, в TINYTEXT.

  Ответить  
 
 автор: Саня   (17.01.2010 в 22:16)   письмо автору
 
   для: ~AquaZ~   (17.01.2010 в 20:29)
 

Данные в TINYTEXT имеют один байт накладных расходов, так что фактически получится 5 байт.
Помимо этого становится невозможным поиск по диапазонам. Именно ради этого IP и преобразуют в INT. Ну и конечно же для экономии места.
Даже не знаю, стоит ли говорить после всего вышесказанного, что операции над числами производятся намного быстрее чем над строками...

  Ответить  
 
 автор: ~AquaZ~   (18.01.2010 в 14:22)   письмо автору
 
   для: Саня   (17.01.2010 в 22:16)
 

Ладно, убедил...

  Ответить  
 
 автор: heed   (17.01.2010 в 20:40)   письмо автору
 
   для: ~AquaZ~   (17.01.2010 в 18:59)
 

способов много

<pre><?php
$txt 
="127.0.0.2";

print_r($arr sscanf($txt"%d.%d.%d.%d"));
for(
$i=0$r=0$i<4$i++)
        
$r =(($r <<)|$arr[$i]);
var_dump($r);

var_dump($r sprintf("%4\$d.%3\$d.%2\$d.%1\$d",
 (
$r&0xff), (($r>>=8)&0xff), (($r>>=8)&0xff), (($r>>=8)&0xff) ));
?>

// int тоже четыре байта в нормальных системах

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования