IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

parseur + hexadecimal


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut parseur + hexadecimal
    Bonjour,

    Je n'ai pas fait de dev depuis longtemps et j'avais fait très peu de perl...

    Voilà mon pb:
    J'ai en entré la commande suivante:
    nms:/usr/local/cacti/scripts# snmpget -m all -c public -v2c 172.16.255.105 cnfPSPacketSizeDistribution.0
    CISCO-NETFLOW-MIB::cnfPSPacketSizeDistribution.0 = Hex-STRING: 00 02 01 72 01 07 00 1C 00 0B 00 05 00 A4 00 0F
    00 02 00 03 00 03 00 04 00 05 00 0A 00 04 00 03
    00 03 00 02 00 13 00 4B 00 00 00 00 00 00 00 00
    00 00 00 00

    qui correspond à ces statistiques:
    router#sh ip cache flow
    IP packet size distribution (922954 total packets):
    1-32 64 96 128 160 192 224 256 288 320 352 384 416 448 480
    .002 .370 .263 .028 .011 .005 .164 .015 .002 .003 .003 .004 .005 .010 .004

    512 544 576 1024 1536 2048 2560 3072 3584 4096 4608
    .003 .003 .002 .019 .075 .000 .000 .000 .000 .000 .000

    Je voudrais faire un script perl qui parse la sortie de la commande snmget et qui retourne:
    32:0,2 64:37 97:26,3 128:2,8 160:1,1 192:0,5 224:1,5 156:1,5 288:0,2 320:0,3 352:0,3 384:0,4 416:0,5 448:1 480:0,4 512:0,3 544:0,3 576:0,2 1024:1,9 1536:7,5 2048:0 2560:0 3072:0 3584:0 4096:0 4608:0

    Où :
    32:0,2
    32 est une valeur fixe, 0,2 est un pourcentage qui correspond à la valeur des deux premiers octet de la liste Hex-STRING diviser par cent (00 02).
    64:37
    64 est une valeur fixe, 37 est le pourcentage qui correspond à 01 72 convertie en décimal puis diviser par cent.

    M'enfin, voilà où j'en suis de mon script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #!/usr/bin/perl
     
    open(PROCESS, "snmpget -m all -c public -v2c 172.16.255.105 cnfPSPacketSizeDistribution.0|");
    $pcksize = <PROCESS>;
    close(PROCESS);
    $pcksize =~ m/(.*Hex-STRING: )(.*)/;
     
    print $2;
    mais cela ne m'affiche que la premiére ligne...


    Autrement dit, je rame quelqu'un pourrait m'aider ou me donner quelque mot clef ou un programme s'approchant de ça (parseur + hexadecimal)?

    Pour commencer je cherche a récupérer la chaine Hex-STRING, dans un tableau…

    Merci de m'avoir lut jusqu'ici!

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    open(PROCESS, "snmpget -m all -c public -v2c 172.16.255.105 cnfPSPacketSizeDistribution.0|");
    while($pcksize = <PROCESS>) {
      $pcksize =~ m/(.*Hex-STRING: )(.*)/;
      print $2,"\n";
    }
    close(PROCESS);

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut
    merci beaucoup pour la réponse si rapide!
    malheureusement cela ne m'aiguille pas encore assez


    en effet la le resultat affiche 4 fois les chiffre hexa de la premiere ligne et je ne comprend pas pourquoi.

    Voila là voie que je suis en train de suivre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #!/usr/bin/perl
     
    open(PROCESS, "snmpget -m all -c public -v2c 172.16.255.105 cnfPSPacketSizeDistribution.0|");
    @snmpget = <PROCESS>;
    close(PROCESS);
     
    # voila les 4 ligne resultat de snmpget
    print $snmpget[0];
    print $snmpget[1];
    print $snmpget[2];
    print $snmpget[3];
     
    # supression du texte inutile
    $snmpget[0] =~ m/(.*Hex-STRING: )(.*)/;
    $snmpget[0] = $2;
     
    # split en mot de la premiere ligne
    @tableau1 = split (/ /, $snmpget[0]);
    for ($i = 0; $tableau1[$i]; $i=$i + 2)
    {
    print "i=$i\n";
    print $tableau1[$i];
    print $tableau1[$i+1];
    print "\n";
    }
    exit
    C'est peut-être un raisonnement trop proche du C...
    mais bon, je me dit qu'un fois que j'aurais spliter tous les chiffre hexa dans un tableau, je les concaténerai 2 à 2 et je les convertirai en décimal puis je les diviserai par 100 puis je les afficherai...

    Si vous avez des commentaire sur ma méthode, je suis preuneuse...
    histoire de faire un truc plus propre, même si dans mon cas, il faut que ça fonctionne et c'est tout...

    Merci encore pour votre coup de pouce

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut
    Aller une dernière question:

    j'ai un tableau de chiffre hexadécimal, je voudrais les concaténer 2 à 2 puis les convertir en décimal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    print "ligne 1\n";
    @tableau1 = split (/ /, $snmpget[0]);
    for ($i = 0; $tableau1[$i]; $i=$i + 2)
    {
    print "i=$i\n";
    print $tableau1[$i];
    print $tableau1[$i+1];
    print "\n";
    }
    Pour l'instant voila la sortie de cette boucle:
    ligne 1
    i=0
    0002
    i=2
    016D
    i=4
    010F
    i=6
    001D
    i=8
    000B
    i=10
    0005
    i=12
    00A3
    i=14
    000F

    par exemple là où i = 4, tableau1[4] = 01 et tableau1[5] = 0F, je voudrai une variable $a=010F (pour l'instant je ne fait qu'afficher...)
    puis la convertir en decimal (0x010F = 271)...
    Quelqu'un a une petite idée?

    Merci encore

  5. #5
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Citation Envoyé par ninititine Voir le message
    par exemple là où i = 4, tableau1[4] = 01 et tableau1[5] = 0F, je voudrai une variable $a=010F (pour l'instant je ne fait qu'afficher...)
    puis la convertir en decimal (0x010F = 271)...
    my $a = $tableau1[$i] . $tableau1[$i+1]
    Il suffit d'utiliser hex() qui te renvoie la valeur en décimal.
    FAQ: http://perl.developpez.com/faq/?page=sectionB2

    Sinon, pour faire plus simple (? disons autrement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    chomp(@snmpget); # enleve les '\n' a la fin des lignes
    my $string = join(" ",@snmpget);
    if ($string =~ m/Hex-STRING:(.*)/) {
    	my $hex = $1;
    	#print "$hex\n";
    	my $i = 0;
            # Tant que l'on trouve deux nombres (separés par des blancs)
    	while ($hex =~ m/(\w{2})\s+(\w{2})/g) {
                    $i += 32;
                    $i = 1024 if ($i == 576+32);
    		print "$i:" . sprintf("%.1f",hex("$1$2") / 10) . " ";
    	}
    }
    On recurpère tous les codes hexa dans la chaine $hex;
    on parse les nombres deux à deux (de deux digits chacuns {2}), le /g permet de continuer le parsing depuis là ou il s'était terminé la dernière fois;
    et on affiche avec une décimale les valeurs divisées par 10 (et non 100?).

    Par contre j'ai triché un peu pour le saut entre 576 et 1024
    Et (pour pinailler) pour la virgule à la place du point (chez moi) comme séparateur de décimales, peut-être que la locale peut jouer... (et enfin, il y a un espace de trop à la fin )

    Quelques remarques:
    - il faut tester si un matching marche
    - c'est pourquoi ton code affichait 4 fois la même chose; les autres lignes n'ayant pas Hex-STRING... $2 n'était pas écrasé

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut [resolut] parseur + hexadecimal
    Ouah!

    J'en demandé pas temps!!!
    Merci beaucoup pour le coup de main!!!


    J'avoue c'est beaucoup plus perlien que ce que j'avais fait!!
    merci encore

    ça redonne envie de coder, tellement c'est beau

Discussions similaires

  1. parseur de fichier
    Par ronan99999 dans le forum C
    Réponses: 10
    Dernier message: 10/02/2004, 12h46
  2. Conversion binaire -> hexadecimal
    Par barthelv dans le forum C
    Réponses: 2
    Dernier message: 06/08/2003, 10h40
  3. [debutant???] Parseur & portabilté
    Par miloux32 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 24/07/2003, 13h20
  4. Convertir une AnsiString en hexadecimal
    Par manathan01 dans le forum C++Builder
    Réponses: 3
    Dernier message: 26/12/2002, 09h27
  5. Réponses: 3
    Dernier message: 04/09/2002, 09h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo