Forum Webscript.Ru

Программирование => Perl => Тема начата: GunJah от 16 Июня 2005, 17:05:36

Название: Convert::ASN1
Отправлено: GunJah от 16 Июня 2005, 17:05:36
Доброго времени суток
:cool:

Вопросик по модулю:
Если некое поле (IP) типа OCTET_STRING, как с помощью вышеуказанного модуля впихнуть туды ай-пишник (к примеру вида: 0.0.0.0), чтоб в самом конфиге он выглядел как 4 байта (ту бишь: 30 30 30 30) ?

Заранее пааасибо :)
Название: Convert::ASN1
Отправлено: GunJah от 16 Июня 2005, 17:09:27
Небольшое добавление:
С помощью сего модуля пишется интерфейс к конфигурационному файлу в формате ASN-1
Ту бишь сначала парсится этот конфиг в хэш, а потом обратно уже с новыми данными... И не получается впихнуть уже в исходный файл ай-пишник, чтоб он выглядел как 4 байта...
Название: Convert::ASN1
Отправлено: vladsu от 16 Июня 2005, 18:23:47
А может Вам нужно сначала ИП просто запаковать?
Название: Convert::ASN1
Отправлено: GunJah от 20 Июня 2005, 14:12:03
Проблема в том, что при присвоении значения полю IP он воспринимается как строка, ту биш 1 байт на 1 символ, а нужно, чтоб воспринимался как 4 байта :(
Название: Convert::ASN1
Отправлено: Ivan Kolesnikov от 21 Июня 2005, 04:43:18
Я еще начинающий программист и не научился пока применять функции pack/unpack :( У меня сделано вот как:

sub ip2dec {
   my $dec = 0; my $ip = $_[0]; my @s = split(/\\./, $ip);
   for (my $i=3; $i>=0; $i--) {$dec += 256**(3-$i) * $s[$i]}
   return $dec;
  }

  sub dec2ip {
   my $ip = \'\'; my $dec = $_[0]; my $s;
   for (my $i=3; $i>=0; $i--) {$s = int($dec / 256**$i); $ip .= $s.\'.\'; $dec -= $s * 256**$i}
   $ip  =~ s/\\.+$//g;
   return ($ip);
  }
Название: Convert::ASN1
Отправлено: GunJah от 06 Июля 2005, 14:50:04
Помогите пожалуйста преобразовать IP к примеру вида:
127.0.0.1
в 4 байта вида:
0x7F 0x00 0x00 0x01

Наверняка уже кому-нить приходилось подобное делать. Help PLEASE =]
Название: Convert::ASN1
Отправлено: Ivan Kolesnikov от 06 Июля 2005, 15:05:46
Если я вас правильно понял, то это то что тебе надо, только праверок на правильность нет:

sub ip_to_hex {
  return join \' \', map {\'0x\' . sprintf("%02lX", $_)} split /\\./, shift;
};

print ip_to_hex(\'127.0.0.1\');
Название: Convert::ASN1
Отправлено: Green Kakadu от 06 Июля 2005, 15:20:26
use Socket;
my $ip = \'127.0.0.1\';
print inet_aton($ip);
Название: Convert::ASN1
Отправлено: GunJah от 06 Июля 2005, 15:55:42
2 Green Kakadu

Спасибо огромное ! Помогло !

А как теперь обратно из бинарика в IP ?
Название: Convert::ASN1
Отправлено: GunJah от 06 Июля 2005, 16:09:20
Sorry, тулю... Уже нашел.
inet_ntoa($_);

Всем ОГРОМНОЕ СПАСИБО !!!
:-)