Forum Webscript.Ru

Программирование => Теория, алгоритмы и стандарты => Тема начата: commander от 17 Января 2005, 10:07:47

Название: перевод ip адреса в целое число(int).
Отправлено: commander от 17 Января 2005, 10:07:47
Интересует алгоритм перевода  ip адреса в целое число(int) не важно на каком языке...

предложения?
Название: перевод ip адреса в целое число(int).
Отправлено: ondr от 17 Января 2005, 11:19:29

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 скорее всего можно оптимизировать, я уже не стал
Название: перевод ip адреса в целое число(int).
Отправлено: commander от 17 Января 2005, 11:48:26
ondr
это конечно... да... но хотелось всё же видеть универсальный алгоритм... без привязок к конкретным функциям конкретных языков программирования... :)
Название: перевод ip адреса в целое число(int).
Отправлено: commander от 17 Января 2005, 11:53:02
для примера:

192.168.0.1
y
3 [192] 3 [168] 1

319231681011

где y - разряд числа, x -число...
Название: перевод ip адреса в целое число(int).
Отправлено: Yukko от 17 Января 2005, 13:28:52
http://php.spb.ru/php/ip.html
читаем, смотрим, какие арифметические дейсвия выполняются, пишем алгоритм. Там несложно!
Название: перевод ip адреса в целое число(int).
Отправлено: ThE0ReTiC от 18 Января 2005, 01:59:58
Yukko
1. Перестаем заниматься идиотизмом и пользуемся [p]ip2long[/p] [p]long2ip[/p]
2. Вопрос был задан безотносительно языка реализации.
по поводу статьи - функции не глючат:
long (а речь идет именно о нем ибо перевод не подрузамевает использование беззнакового типа) = QWORD [-2147483648, 2147483647] = 4 байта
что как раз составляет весь возможный диапазон IP адресов.
3. Оптимальный вариант - использовать функции и/или типы СУБД для хранения, если проект подразумевает что СУБД используется. Вот с этим согласен.
Название: перевод ip адреса в целое число(int).
Отправлено: commander от 18 Января 2005, 10:11:21
ThE0ReTiC
Цитировать
использовать функции и/или типы СУБД для хранения

функции согласен... а на счет встроенных типов... скажу следующее...
на примере PostgreSQL бд объемом (60 Mb) скорость выборки что по полю с типом (int8), что по полю со встроенным типом данных (cidr) одинакова.
Но кол-во занимаемого места:
int8 -  8 bytes
cidr - 12 or 24 bytes
зачем платить больше? :)
единственный минус в том, что в PostgreSQL нет встроенной функции перевода ip в int, но это решаеться путём написания своей функции на С ... благо постгрес это поддерживает...