Forum Webscript.Ru
Программирование => Теория, алгоритмы и стандарты => Тема начата: commander от 17 Января 2005, 10:07:47
-
Интересует алгоритм перевода ip адреса в целое число(int) не важно на каком языке...
предложения?
-
my $int = ip2UL("192.168.0.1");
print $int, "\\n"; # 3232235521
my $ip = UL2ip($int);
print $ip, "\\n"; # 192.168.0.1
sub UL2ip
{
my $int = shift;
return join(".", unpack("C4", pack("N", $int)));
}
sub ip2UL
{
my ($ip, $bin) = shift;
$bin .= unpack("B8", pack("C", $_)) for split(/\\./, $ip);
# $bin = join("", map {unpack("B8", pack("C", $_))} split(/\\./, $ip));
return unpack("N", pack("B32", $bin));
}
Функцию ip2UL скорее всего можно оптимизировать, я уже не стал
-
ondr
это конечно... да... но хотелось всё же видеть универсальный алгоритм... без привязок к конкретным функциям конкретных языков программирования... :)
-
для примера:
192.168.0.1
y
3 [192] 3 [168] 1
319231681011
где y - разряд числа, x -число...
-
http://php.spb.ru/php/ip.html
читаем, смотрим, какие арифметические дейсвия выполняются, пишем алгоритм. Там несложно!
-
Yukko
1. Перестаем заниматься идиотизмом и пользуемся [p]ip2long[/p] [p]long2ip[/p]
2. Вопрос был задан безотносительно языка реализации.
по поводу статьи - функции не глючат:
long (а речь идет именно о нем ибо перевод не подрузамевает использование беззнакового типа) = QWORD [-2147483648, 2147483647] = 4 байта
что как раз составляет весь возможный диапазон IP адресов.
3. Оптимальный вариант - использовать функции и/или типы СУБД для хранения, если проект подразумевает что СУБД используется. Вот с этим согласен.
-
ThE0ReTiC
использовать функции и/или типы СУБД для хранения
функции согласен... а на счет встроенных типов... скажу следующее...
на примере PostgreSQL бд объемом (60 Mb) скорость выборки что по полю с типом (int8), что по полю со встроенным типом данных (cidr) одинакова.
Но кол-во занимаемого места:
int8 - 8 bytes
cidr - 12 or 24 bytes
зачем платить больше? :)
единственный минус в том, что в PostgreSQL нет встроенной функции перевода ip в int, но это решаеться путём написания своей функции на С ... благо постгрес это поддерживает...