perl pack/unpack
От: Knuckles Россия  
Дата: 06.10.06 16:03
Оценка:
Надо переписать перловый скрипт на си либо паскаль (неважно, лишь бы от скрипта избавиться).
Вот основной кусок, с которым у меня проблеммы:
$src_ip = inet_ntoa ( pack ( "N", unpack ( "%32l" , $src_ip ) ) );
$dst_ip = inet_ntoa ( pack ( "N", unpack ( "%32l" , $dst_ip ) ) );
$bytes = unpack ( "%32I" , $bytes );
$packets = unpack ( "%32I" , $packets );
$src_port = unpack ( "%16S" , $src_port );
$dst_port = unpack ( "%16S" , $dst_port );
$t_class = unpack ( "%16S" , $t_class );
$timestamp = unpack ( "%32I" , $timestamp );
Пытался разобраться, что тут вообще происходит, но это пока выше моих сил.
В общем подскажите, как то же самое реализовать. Была идея импортировать эти функции из perl58.dll... но тут я тоже неуверен, как правильно сделать. Словом мысли в эту сторону тоже приветствуются. Зачем писать заново, если есть готовое?
Самурай без меча подобен самураю с мечом, но только без меча...
Re: perl pack/unpack
От: Rebus83 Россия  
Дата: 08.10.06 20:09
Оценка:
Здравствуйте, Knuckles, Вы писали:

K>Надо переписать перловый скрипт на си либо паскаль (неважно, лишь бы от скрипта избавиться).

K>Вот основной кусок, с которым у меня проблеммы:
K> $src_ip = inet_ntoa ( pack ( "N", unpack ( "%32l" , $src_ip ) ) );
K> $dst_ip = inet_ntoa ( pack ( "N", unpack ( "%32l" , $dst_ip ) ) );

Функция inet_ntoa() преобразует IP-адрес in, заданный в
сетевом порядке расположения байтов, в стандартный
строчный вид, из номеров и точек. Строка располагается в
статически размещенном буфере; последующие вызовы
перепишут его данные.


Это отсюда. Думаю, из описания понятно, что должно было располагаться в $src_ip и dst_ip до этих двух строчек, и что оказалось там после.

K> $bytes = unpack ( "%32I" , $bytes );

K> $packets = unpack ( "%32I" , $packets );
K> $src_port = unpack ( "%16S" , $src_port );
K> $dst_port = unpack ( "%16S" , $dst_port );
K> $t_class = unpack ( "%16S" , $t_class );
K> $timestamp = unpack ( "%32I" , $timestamp );
K>Пытался разобраться, что тут вообще происходит, но это пока выше моих сил.
K>В общем подскажите, как то же самое реализовать. Была идея импортировать эти функции из perl58.dll... но тут я тоже неуверен, как правильно сделать. Словом мысли в эту сторону тоже приветствуются. Зачем писать заново, если есть готовое?

Hint: доку по функциям pack/unpack можно посмотреть здесь и здесь.
Если кратко, то разбирается какая-то информация, явно связанная с работой с протоколом IP: в "пригодном для прочтения" и понимания виде получается информация об IP-адресах источника и приемника, числе [переданных|принятых] байт и пакетов, портах источника и приемника, и пр. Если хотите подробнее, приводите весь код.

PS импортировать это из perl58.dll скорее всего не получится, да и не нужно. Часто, функции Перл являются надстройками над аналогичными C-функциями в Unix, так что проще обратиться к первоисточнику.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Какая странная планета! — подумал Маленький принц. — Совсем сухая,
вся в иглах и соленая. И у людей не хватает воображения. Они только
повторяют то, что им скажешь...
Re[2]: perl pack/unpack
От: Knuckles Россия  
Дата: 10.10.06 09:45
Оценка:
Спасибо за подсказку. Уже разобрался что к чему примерно. Файл в итоге прочитал. Для этого достаточно было объявить такую структуру:
type
  dStatRec = packed record
  src_d:Byte;
  src_c:Byte;
  src_b:Byte;
  src_a:Byte;
  dst_d:Byte;
  dst_c:Byte;
  dst_b:Byte;
  dst_a:Byte;
  packets:LongWord;
  bytes:LongWord;
  src_port:Word;
  dst_port:Word;
  t_class:Word;
  datetime:LongWord;
  end;

...и читать как файл типа dStatRec. Теперь видимо можно оптимизировать это в свете использования функции inet_ntoa(). Просто я сперва думал, что перл своими функциями как-то сжимает данные, оказалось — нет. Осталась только одна небольшая проблемка. Не смог без шаманства раскодировать дату (последнее поле). Delphi функция UnixToDateTime возвращает результат больше на месяц без 6 часов, чем это делает перловский скрипт. GetLocalTime и другие не помогли. Теперь я просто перед вызовом этой функции отнимаю от прочитанного datetime магическое число. Только не совсем уверен, будет ли это всегда правильно работать.
Самурай без меча подобен самураю с мечом, но только без меча...
Re[3]: perl pack/unpack
От: Rebus83 Россия  
Дата: 10.10.06 17:49
Оценка:
Здравствуйте, Knuckles, Вы писали:

K>...и читать как файл типа dStatRec. Теперь видимо можно оптимизировать это в свете использования функции inet_ntoa(). Просто я сперва думал, что перл своими функциями как-то сжимает данные, оказалось — нет. Осталась только одна небольшая проблемка. Не смог без шаманства раскодировать дату (последнее поле). Delphi функция UnixToDateTime возвращает результат больше на месяц без 6 часов, чем это делает перловский скрипт. GetLocalTime и другие не помогли. Теперь я просто перед вызовом этой функции отнимаю от прочитанного datetime магическое число. Только не совсем уверен, будет ли это всегда правильно работать.


Возможно это вам поможет?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Какая странная планета! — подумал Маленький принц. — Совсем сухая,
вся в иглах и соленая. И у людей не хватает воображения. Они только
повторяют то, что им скажешь...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.