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

C++ Discussion :

Conversion Int > String adaptation code RFsniffer Raspberry


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 50
    Par défaut Conversion Int > String adaptation code RFsniffer Raspberry
    Bonjour,
    le C++ n'est pas un langage que j'utilise. Je suis plutôt vbnet / php ...
    J'essaie d'adapter le code si dessous pour afin d'obtenir une requête INSERT correctement formatée. Je rencontre un souci pour faire entrer la variable "value" de type INT dans la chaine String "sSQL". voir ligne 49 et 65 du code.

    A la compilation, j'ai une erreur de conversion de type. J'ai chercher un peu partout mais quand je teste des choses, j'ai soit un problème de dépendance avec des fonctions qui n'existe alors pas (IOTA...) , soit un autre problème de conversion de type.

    L'ensemble fonctionnera sous Debian dans un raspberry et permet d'écouter les messages reçu en 433Mhz.

    Merci de votre aide.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    /*
      RFSniffer
     
      Usage: ./RFSniffer [<pulseLength>]
      [] = optional
     
      Hacked from http://code.google.com/p/rc-switch/
      by @justy to provide a handy RF code sniffer
    */
     
    #include "RCSwitch.h"
    #include <stdlib.h>
    #include <stdio.h>
    #include <string>
    #include <postgresql/libpq-fe.h>
     
    RCSwitch mySwitch;
     
     
     
    int main(int argc, char *argv[]) {
     
    //nécessaire pour se connecter à postgresql
    PGconn          *conn;
    PGresult        *res;
     
         // This pin is not the first pin on the RPi GPIO header!
         // Consult https://projects.drogon.net/raspberry-pi/wiringpi/pins/
         // for more information.
         int PIN = 2;	 
     
         if(wiringPiSetup() == -1) {
           printf("wiringPiSetup failed, exiting...");
           return 0;
         }
     
         int pulseLength = 0;
         if (argv[1] != NULL) pulseLength = atoi(argv[1]);
     
         mySwitch = RCSwitch();
    	 if (pulseLength != 0) mySwitch.setPulseLength(pulseLength);
         mySwitch.enableReceive(PIN);  // Receiver on interrupt 0 => that is pin #2
     
     
         while(1) {
     
          if (mySwitch.available()) {
     
            int value = mySwitch.getReceivedValue(); //=> Je veux pouvoir entrer value en string dans la requête
     
     
            if (value == 0) {
              printf("Unknown encoding\n");
            } else {    
     
    		conn = PQconnectdb("dbname=bdd_name host=localhost user=USER password=********");
    		if (PQstatus(conn) == CONNECTION_BAD) {
                     puts("Impossible de se connecter à la bdd");
                     exit(0);
             }
     
    		//on déclare le string 
    		std::string sSQL;
    		sSQL.append("INSERT INTO tb_rf (rf_nom) values ('");
    		sSQL.append(value); //<= la valeur ici en char
    		sSQL.append("')");  
    		res = PQexec(conn,sSQL.c_str());
     
            printf("Received et enregistrer%i\n", mySwitch.getReceivedValue() );
            }
     
            mySwitch.resetAvailable();
     
          }
     
     
      }
     
      exit(0);
     
     
    }

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    C'est parce que ce n'est pas iota mais itoa pour Int TO Array (of chars). Cela dit, cette fonction est déconseillée, je crois.

    La solution canonique en C++ serait de passer par un std::ostringstream (de <sstream>)

    Essaie cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <typename T>
    std::string stringify(T const& value) {
        std::ostringstream stream;
        stream << value;
        return stream.str();
    }
    Que tu utiliserais ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sSQL.append(stringify(value).c_str()); //<= la valeur ici en char
    Et puisque tu en es là, tu peux carrément passer à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		std::ostringstream sSQL;
    		sSQL<<"INSERT INTO tb_rf (rf_nom) values ('" << value << "')";
    		res = PQexec(conn,sSQL.str());
    Par contre, c'est un appel à l'injection sql. Tu devrais passer par une "prepared statement" ou toute solution équivalente.
    D'après-toi, que se passerait-il si le programme lit la valeur "a'); drop table tf_rf;--"?

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 50
    Par défaut
    Mille Mercis !

    Voilà qui fonctionne enfin !

    Merci également pour les rappels.
    je poste le code complet si quelqu'un veut le voir en entier.
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #include "RCSwitch.h"
    #include <stdlib.h>
    #include <stdio.h>
    #include <string>
    #include <sstream>
    #include <postgresql/libpq-fe.h>
     
    RCSwitch mySwitch;
    template <typename T>
    std::string stringify(T const& value) {
        std::ostringstream stream;
        stream << value;
        return stream.str();
    }
     
     
     
    int main(int argc, char *argv[]) {
     
    //nécessaire pour se connecter à postgresql
    PGconn          *conn;
    PGresult        *res;
     
         // This pin is not the first pin on the RPi GPIO header!
         // Consult https://projects.drogon.net/raspberry-pi/wiringpi/pins/
         // for more information.
         int PIN = 2;	 
     
         if(wiringPiSetup() == -1) {
           printf("wiringPiSetup failed, exiting...");
           return 0;
         }
     
         int pulseLength = 0;
         if (argv[1] != NULL) pulseLength = atoi(argv[1]);
     
         mySwitch = RCSwitch();
    	 if (pulseLength != 0) mySwitch.setPulseLength(pulseLength);
         mySwitch.enableReceive(PIN);  // Receiver on interrupt 0 => that is pin #2
     
     
         while(1) {
     
          if (mySwitch.available()) {
     
            int value = mySwitch.getReceivedValue(); //=> Je veux pouvoir entrer value en string dans la requête		
     
     
            if (value == 0) {
              printf("Unknown encoding\n");
            } else {    
     
    		conn = PQconnectdb("dbname=bdd_name host=localhost user=user_name password=*******");
    		if (PQstatus(conn) == CONNECTION_BAD) {
                     puts("Impossible de se connecter à la bdd");
                     exit(0);
             }
     
     
    		//on déclare le string 
    		std::string sSQL;
    		sSQL.append("INSERT INTO tb_rf (rf_nom) values ('");
    		sSQL.append(stringify(value).c_str()); //<= la valeur ici en char
    		sSQL.append("')");  
    		res = PQexec(conn,sSQL.c_str());
     
            printf("Reçu et enregistré%i\n", mySwitch.getReceivedValue() );
            }
     
            mySwitch.resetAvailable();
     
          }
     
     
      }
     
      exit(0);
     
     
    }

  4. #4
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Sinon, depuis C++11, il y a une fonction std::to_string qui prend en entrée une valeur numérique (et retourne un std::string).

  5. #5
    Invité de passage
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1
    Par défaut
    Citation Envoyé par leternel Voir le message
    Par contre, c'est un appel à l'injection sql. Tu devrais passer par une "prepared statement" ou toute solution équivalente.
    D'après-toi, que se passerait-il si le programme lit la valeur "a'); drop table tf_rf;--"?
    Très bon automatisme vis-à-vis de l'injection SQL leternel.

    Cependant vu que la variable value est typée en int, est-ce qu'il y a un risque ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Il aussi les fonctions sprintf ou _snprintf (*) qui permettent d'avoir un peu plus: héxa, bourrage, ...

    Par contre , je ne sais pas si tu peux directement passer le retour de la méthode c_str(), ou alors avoir un petit tableau de caractères char little_buffer[20].


    * -> Fonction Microsoft Windows parce que le C++ a attendu 2011 pour la fournir snprintf c++11

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Citation Envoyé par Yo4nn Voir le message
    Très bon automatisme vis-à-vis de l'injection SQL leternel.

    Cependant vu que la variable value est typée en int, est-ce qu'il y a un risque ?
    Dans le fragment, non, mais une bonne habitude se prend systématiquement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. conversion int to string
    Par modafine dans le forum C#
    Réponses: 1
    Dernier message: 08/08/2008, 10h41
  2. Conversion int en string pour paramatre fonction
    Par Aliveli dans le forum Visual C++
    Réponses: 9
    Dernier message: 10/10/2006, 21h56
  3. conversion int to string ??
    Par mencaglia dans le forum C++
    Réponses: 2
    Dernier message: 14/04/2006, 01h06
  4. problème de conversion int[x] --> string
    Par poussinphp dans le forum SL & STL
    Réponses: 2
    Dernier message: 17/08/2005, 14h45
  5. Réponses: 2
    Dernier message: 21/06/2004, 15h55

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