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 :

changement de type d'un tableau de short


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 2
    Points : 4
    Points
    4
    Par défaut changement de type d'un tableau de short
    J'ai des valeurs octales (0xabcd) de type short (si j'étais en C) et je désire les envoyer dans une trame UDP. J'utilise la commande d'envoi :
    $sock->send(0xabcd);
    Dans WireShark je vois 34 33 39 38 31 (ce qui correspond à la chaîne de caractères 43981 i.e. 0xabcd)
    Je peux utiliser $sock->send(chr(0xab).chr(0xcd)) et là cela fonctionne.

    Si j'utilise $sock->send(chr(0xabcd)) j'ai l'erreur : "Wide character in send at /usr/lib/perl5/5.10.1/i386-linux-thread-multi/IO/Socket.pm line 270"
    Je suis obligé pour l'instant de faire :

    my $monHex=0xabcd; # car mes valeurs sont de type short et par char
    $sock->send(chr(($monHex&0xff00)>>8).chr($monHex&0x00ff));


    Cela fonctionne, mais c'est très lent...

    En C, j'aurais fait un tableau de short, et au moment de l'envoyer dans le send, je l'aurais casté en tableau de char.

    Merci par avance pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Euh, déjà oxabcd, ce n'est pas de l'octal, mais de l'hexadécimal, me semble-t-il...

    Et puis, il n'y a pas de shorts en Perl (tout au plus éventuellement des strings), pas plus que des chars au sens C du terme, il vaut mieux éviter de raisonner en termes d'un autre langage.

    La fonction chr retourne le caractère représenté par son argument, il n'y a pas de caractère correspondant à la valeur hexa oxabcd (ou décimale 43981), sauf éventuellement en Unicode (mais ce n'est pas ce dont il s'agit), donc ça ne peut pas marcher. Si tu essaies 'print chr(oxabcd)', tu auras le même message d'erreur (Wide character in print ...).

    Les fonctions Perl pour résoudre ce genre de problèmes sont généralement les fonction pack et unpack. Mais je ne suis pas sûr des options à utiliser dans ton cas particulier.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Merci pour ton aide
    Citation Envoyé par Lolo78 Voir le message
    Les fonctions Perl pour résoudre ce genre de problèmes sont généralement les fonction pack et unpack. Mais je ne suis pas sûr des options à utiliser dans ton cas particulier.
    Merci pour ton aide qui me permet d’être 5 fois plus rapide.

    # nom : shortToString
    # entree : un short sur forme 0xabcd
    # sortie : deux lettres
    sub shortToString {

    # nouveau code
    my @tab = unpack 'C*', pack ("S", $_[0]);
    return (chr($tab[1]).chr($tab[0]));

    # ancient code
    #return (chr(($_[0]&0xff00)>>8).chr($_[0]&0x00ff));
    }


    Le but de mon programme c’est d’interroger un automate en ModBus TCP et de diffuser en UDP les paramètres lus vers des systèmes d’acquisition de données. Grâce à ton aide, je suis passé d’une fréquence de 2 Hz, qui était limite, à une fréquence de 10 Hz, qui est parfaite. Je pense que l’on peut encore améliorer le code… mais après il irait trop vite
    C'était mon premier programme en Perl... Mon Hello World à moi.

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Eh bien, j'ai juste donné des pointeurs, je ne savais franchement pas comment résoudre ton problème (je ne suis même pas sûr que je le comprenais vraiment), content que ça t'ai rendu service. Et bravo à toi, les fonctions pack et unpack sont loin d'être les plus simples à comprendre du langage, chapeau pour ton 'hello world".

    Continue à faire du Perl, je pense que tu vas devenir un guru.


Discussions similaires

  1. type de donnée tableau multidimensionnel
    Par opheliegomes dans le forum Débuter
    Réponses: 2
    Dernier message: 03/02/2005, 12h29
  2. PB changement de type d'un champ ds INTERBASE
    Par vanoou dans le forum InterBase
    Réponses: 3
    Dernier message: 03/01/2005, 17h24
  3. Changement de type
    Par spoutyoyo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 20/08/2004, 15h39
  4. [CR]Changement de type de base de donnée
    Par nabil dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 12/04/2004, 22h42
  5. changement de type pour un champ dans une table
    Par Missvan dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/02/2004, 15h26

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