|
|
|
| Достаточно строки из 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]);
}
| По-моему разумно, ничего ни умножать, ни делить. Исправьте, если что не так. | |
|
|
|
|
|
|
|
для: ~AquaZ~
(17.01.2010 в 18:59)
| | В чём разумность? Какие преимущества над ip2long()? | |
|
|
|
|
|
|
|
для: Саня
(17.01.2010 в 20:26)
| | Ненадо ничего возводить в степень и перемножать, а для раскодирования делить. Умещается в 4 знака, в TINYTEXT. | |
|
|
|
|
|
|
|
для: ~AquaZ~
(17.01.2010 в 20:29)
| | Данные в TINYTEXT имеют один байт накладных расходов, так что фактически получится 5 байт.
Помимо этого становится невозможным поиск по диапазонам. Именно ради этого IP и преобразуют в INT. Ну и конечно же для экономии места.
Даже не знаю, стоит ли говорить после всего вышесказанного, что операции над числами производятся намного быстрее чем над строками... | |
|
|
|
|
|
|
|
для: Саня
(17.01.2010 в 22:16)
| | Ладно, убедил... | |
|
|
|
|
|
|
|
для: ~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 <<8 )|$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 тоже четыре байта в нормальных системах | |
|
|
|