Форум: "Потрепаться";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизPerl-функция pack Найти похожие ветки
← →
Джо © (2005-10-25 21:37) [0]Знатоки Перла, объясните, плиз, человеческими словами, что именно проделывает нижеприведенный вызов функции
$raw = pack ("B32", (1 x $mask), (1 x (32 - $mask)));
Например, при $mask=30 на выходе имеем 4244635647.
Накопал описание сабжевой функции, но понять механизм не могу, так как даже понятия не имею, что означает "x".
Сорри, Перла не знаю совсем и, похоже, за пару часов выучить его так и не смог :)
← →
palva © (2005-10-25 22:17) [1]Пусть $mask = 30
(1 x $mask) означает строку, где левый аргумент "1" повторяется $mask раз. "B32" означает, что аргумент интерпретируется как 32-битная строка, два правых бита остаются нулевыми. Второй аргумент функции pack в данном случае не используется. Результат функции упаковывается в строку $raw и занимает 4 байта. Если двоичное представление этой строки рассматривать как двоичное представление целого числа (порядок байтов в числе обратный), то получится ваше число 4244635647 Правда, вы не написали, как вы получили это число.
← →
Kerk © (2005-10-25 22:33) [2]Perl - язык для шаманов (с) Я :)
← →
Джо © (2005-10-25 22:41) [3]
> [1] palva © (25.10.05 22:17)
Большое спасибо за помощь. А то уже стал закипать 8-|
Непонятно, все-же, зачем там второй аргумент, но это мелочи :)
Это я пытался разпарсить подсеть/маску вида a.b.c.d/mask. Никак не мог понять принцип, по которому этот mask преобразуется. А из примеров в сетке нашел только на Перле, будь он неладен :) Но ничего, теперь понятно. Еще раз спасибо. Буду сейчас думать как на Паскале перекрутить попроще.
← →
Джо © (2005-10-25 22:42) [4]
> [2] Kerk © (25.10.05 22:33)
> Perl - язык для шаманов (с) Я :)
Не то слово ;)
← →
palva © (2005-10-25 22:45) [5]> Буду сейчас думать как на Паскале перекрутить попроще.
А зачем на паскале? На перле прикольней.
← →
Джо © (2005-10-25 22:50) [6]
> [5] palva © (25.10.05 22:45)
> А зачем на паскале? На перле прикольней.
Насчет прикольней-то оно, конечно, да. Но программа на Делфи пишется, так что никуда не денешься. А Перлу уже анинсталл сделал, т.к., он мне нужен был только чтобы с примером разобраться. Как оказалось, без посторонней помощи все-равно не разобрался бы. Спасибо :)
Уже в качестве оффтопа, на Паскале, по-моему, проще и быстрее всего готовый массив констант сделать, благо, значений всего 32.
← →
isasa © (2005-10-25 22:55) [7]проще и быстрее всего готовый массив констант сделать, благо, значений всего 32.
A почему не DWORD ?
subnet:=(ip and mask);
....
← →
Джо © (2005-10-25 23:00) [8]
> [7] isasa © (25.10.05 22:55)
Не понял.
← →
isasa © (2005-10-25 23:14) [9]Джо © (25.10.05 23:00) [8]
Ты хочешь получить адрес подсети? Или я неправильно понял?
← →
Джо © (2005-10-25 23:26) [10]
> [9] isasa © (25.10.05 23:14)
Есть адрес, записанный в форме a.b.c.d/m, например
123.123.45.4/30
Вот нужно это 30 (m) перевести в форму:
11111100 11111111 11111111 11111111b = 0xFCFFFFFF = 4244635647 Dec.
Назовем это значение mm.
Собственно, я уже разобрался как это делается.
А нужно это для того, чтобы выяснить вхождение адреса в подсеть, записанную вышеуказанным образом, т.е, вхождение имеет место если справедливо:some_ip and mm = net_ip
some_ip - адрес, записанный с обратным порядком байт
net_ip - a.b.c.d. с обратным порядком байт
Все вроде нормально таким образом считается, достаточно вычислить это mm. Или я чего-то перемудрил?
← →
isasa © (2005-10-25 23:50) [11]А что-то, типа..
i:=1;
mm:=0;
while i<=n do begin
mm:=mm*power(2, 32-i);
i:=i+1;
end;
n:=30 <- mask
Сейчас, хоть убей не вспомню, power - overload, или нет. Но возводить целое в целую.
← →
Kerk © (2005-10-25 23:51) [12]isasa © (25.10.05 23:50) [11]
mm:=mm*power(2, 32-i);
зачем power? shl отменили?
← →
isasa © (2005-10-25 23:57) [13]Виноват. :)
Пора идти спать.
← →
isasa © (2005-10-26 00:07) [14]Сорри, ошибка.
...
mm:=1;
while i<=n do begin
...
← →
Джо © (2005-10-26 00:26) [15]Да, все равно по таблице быстрее считается ;)
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.035 c