Автор Тема: перевод ip адреса в целое число(int).  (Прочитано 8222 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
перевод ip адреса в целое число(int).
« : 17 Января 2005, 10:07:47 »
Интересует алгоритм перевода  ip адреса в целое число(int) не важно на каком языке...

предложения?
And no religion too...

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
перевод ip адреса в целое число(int).
« Ответ #1 : 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 скорее всего можно оптимизировать, я уже не стал
0 OK, 0:1

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
перевод ip адреса в целое число(int).
« Ответ #2 : 17 Января 2005, 11:48:26 »
ondr
это конечно... да... но хотелось всё же видеть универсальный алгоритм... без привязок к конкретным функциям конкретных языков программирования... :)
And no religion too...

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
перевод ip адреса в целое число(int).
« Ответ #3 : 17 Января 2005, 11:53:02 »
для примера:

192.168.0.1
y

3 [192] 3 [168] 1
  • 1 [1]


319231681011

где y - разряд числа, x -число...
And no religion too...

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
перевод ip адреса в целое число(int).
« Ответ #4 : 17 Января 2005, 13:28:52 »
http://php.spb.ru/php/ip.html
читаем, смотрим, какие арифметические дейсвия выполняются, пишем алгоритм. Там несложно!
работа в Украине

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
перевод ip адреса в целое число(int).
« Ответ #5 : 18 Января 2005, 01:59:58 »
Yukko
1. Перестаем заниматься идиотизмом и пользуемся [p]ip2long[/p] [p]long2ip[/p]
2. Вопрос был задан безотносительно языка реализации.
по поводу статьи - функции не глючат:
long (а речь идет именно о нем ибо перевод не подрузамевает использование беззнакового типа) = QWORD [-2147483648, 2147483647] = 4 байта
что как раз составляет весь возможный диапазон IP адресов.
3. Оптимальный вариант - использовать функции и/или типы СУБД для хранения, если проект подразумевает что СУБД используется. Вот с этим согласен.
AS IS...

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
перевод ip адреса в целое число(int).
« Ответ #6 : 18 Января 2005, 10:11:21 »
ThE0ReTiC
Цитировать
использовать функции и/или типы СУБД для хранения

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

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28