Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.051 c
11-1093729013
Sormy
2004-08-29 01:36
2005.11.20
Delphi 7.0 Вылетает...


2-1130908177
samoilov
2005-11-02 08:09
2005.11.20
progressbar


14-1130239426
Жук
2005-10-25 15:23
2005.11.20
Школьная парта


5-1111751604
Gennadiy
2005-03-25 14:53
2005.11.20
Проблема с созданием компонента!


5-1110291542
Sphinx
2005-03-08 17:19
2005.11.20
Можно ли опубликовать в наследнике функцию ?