[Suite à cette discussion ]
Bonjour,
1) Pourquoi ce const devant le *b ?Code:char const *b = reinterpret_cast< char const * >(a);
2) un dynamic_cast ne suffirait il pas ?
Merci d'avance
( je suis débutant en c++ )
Version imprimable
[Suite à cette discussion ]
Bonjour,
1) Pourquoi ce const devant le *b ?Code:char const *b = reinterpret_cast< char const * >(a);
2) un dynamic_cast ne suffirait il pas ?
Merci d'avance
( je suis débutant en c++ )
- Parce qu'on a un pointeur const en entrée; ne pas le mettre en sortie violerait la const-correctness.
- dynamic_cast, c'est pour les classes uniquement (et encore, seulement celles avec des fonctions membres virtuelles*).
*On ne va pas parler de "classe de base virtuelle" ici, ce n'est pas pour débutants.
D'acc. Ceci est correcte alors ? :
const char *data1;
const unsigned char *data2 = reinterpret_cast< const unsigned char * >(data1);
Je reviens vers vous car je n'ai pas trouvé de solutions à mon problème de conversion de const char* en unsigned const char*. reinterpret_cast me semble le plus pertinent après avoir lu http://cpp.developpez.com/faq/cpp/?page=conversions
Mais ce n'est pas le cas, apparemment il me génère un problème.
en effet, je dois utliser une fonction OpenSSL pour décodé un string ( format PEM codé en base 64, en une structure interne C ( internal C structure ). Voici le prototype de la fonction:
la doc se trouve ici : http://www.openssl.org/docs/crypto/d...#RETURN_VALUESCode:X509 *d2i_X509(X509 **px, const unsigned char **in, int len);
En gros cette fonction lit un string en format PEM qui se trouve dans const unsigend char **in et renvoie une structure X509*
Maintenant, pourquoi j'ai utilisé un cast ? parce que mon constructeur prend en paramètre un PEM de type const char *str. Voici le code :
A priori, je ne peux/dois pas changer la signature de ce constructeur. Donc je suis obligé de partir d'un const char *str.Code:
1
2
3 certificate(const char *str, size_t clen) { unsigned char const *u_str = reinterpret_cast< unsigned char const * >(str); X509* mycert = d2i_X509(NULL, &u_str, clen);
quand je debug, mycert est NULL, ca signifie que d2i_X509 a échoué. l'erreur est en fait :
Je crois que c'est à cause du reinterpret_cast.Code:error:0D07209B:asn1 encoding routines:ASN1_get_object:too long
Est ce que il y a d'autres moyen de résoudre le problème de conversion const char* => unsigned const char* ?
Merci d'avance pour votre aide.
La fonction modifie u_str: Regarde si tu ne dois pas reporter la modification sur str...
Je n'ai pas très bien compris,
la fonction d2i_x509 ne fait que lire ce qu'il y a dans u_str, pourquoi il le modifierait ?
Je ne peux pas reporter la modification sur str car d2i_x509 veut un u_str et non pas un str !
La fonction lit les données pointées, mais incrémente le pointeur.
Code:
1
2
3
4 certificate(const char *str, size_t clen) { //Peut-être aussi en faire un char** ou char*& unsigned char const *u_str = reinterpret_cast< unsigned char const * >(str); X509* mycert = d2i_X509(NULL, &u_str, clen); str = reinterpret_cast< char const * >(u_str);