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 :

un char *data se termine toujours par un \0 ?


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Par défaut un char *data se termine toujours par un \0 ?
    Bonjour,
    J'aimerais savoir si un char *data doit toujours se terminer par un \0 peu importe la situation ?
    Par exemple, j'utilise la bibliothèque openssl qui manipule des char*. Mais dans la doc d'openssl, concernant la fonction int BN_bn2bin(const BIGNUM *a, unsigned char *to); ( http://www.openssl.org/docs/crypto/BN_bn2bin.html) il n'est pas précisé que char doit se terminer par un \0.
    Cette fonction est utilisée pour stocker un grand nombre "BIGNUM a" dans une mémoire pointée par "char* to". "char* to" doit etre allouée au préalable.
    BN_num_bytes(a) renvoie la taille occupée par BIGNUM a
    Est ce que je dois faire un :
    char* u_data = new unsigned char[BN_num_bytes(a)+1] ou sans le +1
    Merci d'avance

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Si ton char * est utilisé en tant que chaine de caractères, alors, oui, il faut toujours le terminer soi même par un '\0'. Il faut donc allouer à chaque fois 1 caractère de plus et mettre ce caractère à 0.
    Lors de l'utilisation de fonctions C (strlen, strcat, strcmp, ...) il faut que les chaines soient null-terminated sinon ça crashe ou renvoie n'importe quoi.
    Ta fonction BN_bn2bin ne prend pas un char * mais un UNSIGNED char *. De plus le nom t'indique qu'il s'agit de données binaires, et non d'une chaine de caractères. Tu ne dois donc en aucune façon considérer un caractère valant 0 comme un caractère de terminaison (cette valeur étant plus que fréquente en binaire). Tu dois donc stocker la taille de ton buffer binaire et la trimbaler tant que tu en as besoin (du buffer). Ou tu peux utiliser un std::vector <unsigned char>.
    En utilisant les unsigned char * ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned int size = BN_num_bytes(a);
    unsigned char * u_data = new unsigned char[size];// sans le +1
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Par défaut
    comment dois-je faire alors pour concaténer deux binaires ? vu que strcat ne marche que pour les données textes ?

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    unsigned int sizea = BN_num_bytes(a);
    unsigned char * pa = new unsigned char[sizea];
    BN_bn2bin(a, pa);
     
    unsigned int sizeb = BN_num_bytes(b);
    unsigned char * pb = new unsigned char[sizeb];
    BN_bn2bin(b, pb);
     
    unsigned char * pc = new unsigned char[sizea + sizeb];
    memcpy( pc, pa, sizea);
    memcpy( & pc[sizea], pb, sizeb);
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Par défaut
    Ca marche nikel merci. T'as fait une petite faute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy( & pc[sizea], sizeb, pb);
    Maintenant, je dois initialiser un membre char* data de ma structure info avec notre unsigned char pc*.

    Il faut que je fasse quelque chose du genre info->data = pc;

    En fait ce que j'ai fait c'est un info->data = (char *)pc; Ca compile mais je n'ai pas encore lancé mon prog. Est ce que il y a un risque de perte d'informations à cause du cast ?

    PS: je n'ai pas le droit à priori de changer chat* data en unsigned char* data... car c'est un code que j'ai repris. Mon devoir c'est juste de fournir un data.

  6. #6
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    en fait au final, entre un 'unsigned char' et un 'char', la seule différence est sur l'interprétation des données, pas dans leur stockage. Donc tu ne devrais pas avoir de problème sur ton cast.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #7
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    unsigned int sizea = BN_num_bytes(a);
    unsigned char * pa = new unsigned char[sizea];
    BN_bn2bin(a, pa);
    
    unsigned int sizeb = BN_num_bytes(b);
    unsigned char * pb = new unsigned char[sizeb];
    BN_bn2bin(b, pb);
    
    unsigned char * pc = new unsigned char[sizea + sizeb];
    memcpy( pc, pa, sizea);
    memcpy( & pc[sizea], pb, sizeb);
    la dernière ligne: ca devrait pas être un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy( & pc[sizea+1], pb, sizeb);
    ?
    Sinon le début du contenu de pb écrase la fin du contenu de pa ...

  8. #8
    screetch
    Invité(e)
    Par défaut
    3 allocs au lieu d'une?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int sizea = BN_num_bytes(a);
    unsigned int sizeb = BN_num_bytes(b); 
    unsigned char * pc = new unsigned char[sizea + sizeb];
    BN_bn2bin(a, pc);
    BN_bn2bin(b, pc+sizea);

Discussions similaires

  1. L'utilisateur repasse toujours par le formulaire
    Par Guns Of The Patriots dans le forum Langage
    Réponses: 6
    Dernier message: 31/01/2011, 19h14
  2. Réponses: 6
    Dernier message: 23/12/2009, 11h19
  3. Réponses: 2
    Dernier message: 11/05/2009, 20h18
  4. Réponses: 1
    Dernier message: 28/05/2007, 09h52
  5. La condition passe toujours par else
    Par Him dans le forum Langage
    Réponses: 4
    Dernier message: 16/01/2007, 18h55

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