Problème de conversion unsigned const char* => const char

razuki Messages postés 242 Date d'inscription lundi 17 décembre 2007 Statut Membre Dernière intervention 5 décembre 2012 - 5 avril 2011 à 01:48
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 7 avril 2011 à 00:14
Bonjour,
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:
X509 *d2i_X509(X509 **px, const unsigned char **in, int len);


la doc se trouve ici : http://www.openssl.org/docs/crypto/d...#RETURN_VALUES

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 :
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);


A priori, je ne peux/dois pas changer la signature de ce constructeur. Donc je suis obligé de partir d'un const char *str.

quand je debug, mycert est NULL, ca signifie que d2i_X509 a échoué. l'erreur est en fait :
error:0D07209B:asn1 encoding routines:ASN1_get_object:too long


Je crois que c'est à cause du reinterpret_cast.

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.
A voir également:

7 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
5 avril 2011 à 04:32
salut,


unsigned char *pU8;
char *pS8;

pS8 = (char *) pU8;
pS8 = (unsigned char *) pS8;

@++
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
5 avril 2011 à 04:33
pS8 = (char *) pU8;
pU8 = (unsigned char *) pS8;
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
5 avril 2011 à 10:40
Avant de caster, il ne faut pas oublier que transformer un unsigned en signed, ne se fait jamais sans danger.
Le reinterpret_cast ne devrait pas poser de souci.
As-tu essayé le d2i_X509 sans faire de cast en changeant (temporairement) le constructeur de "certificate", pour avoir le bon type ?
Si le problème est toujours là, alors c'est que c'est les données sur lesquelles tu travailles qui sont fausses et non le cast. (Erreur classique, le cert a été enregistré en Text au lieu de Binary).

PS: Si tu fais du C++, alors "certificate(const char *str, size_t clen)" devrait être "certificate(const std::string& str)", tout simplement.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
razuki Messages postés 242 Date d'inscription lundi 17 décembre 2007 Statut Membre Dernière intervention 5 décembre 2012
5 avril 2011 à 12:44
Je code en c++, mais j'utilise beaucoup de char* et unsigned char* car le code contient plusieurs fonctions C.( j'ai repris un projet écrit à la façon C ). Mais je vais essayer d'utiliser des std::string tant que possible.

Sinon,


J'ai essayé de mettre des unsigned char là ou il faut et j'ai modifié aussi mon constructeur en certificate(unsigned char* ) mais ca m'a généré une autre erreur suivante:
error: ambiguous overload for &#8216;operator=&#8217; in &#8216;((isl::certificate<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >*)this)->isl::certificate<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::data = u_out&#8217;

data est ici l'unsigned char* que je voulais mettre dans mon constructeur certificate(unsigned char*, size_t len) et u_out est un unsigned char* initialisé dans un i2d_X509(..., &u_out)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
razuki Messages postés 242 Date d'inscription lundi 17 décembre 2007 Statut Membre Dernière intervention 5 décembre 2012
6 avril 2011 à 13:41
CptPingu, tu as dit que transformer un unsigned en signed, ne se fait jamais sans danger.
Comment je peux transformer un unsigned char* en signed char* tout en s'assurant qu'il n'y a pas de danger => est ce que il y a une technique, une facon de faire ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
6 avril 2011 à 13:48
Travail toujours avec le même type de donné, c'est généralement mieux.
Si tu choisis des unsigned, reste avec des unsigned. Ne mélange jamais les deux.
Si tu ne peux faire autrement, tant pis, tu peux faire un cast, mais il y a un risque, si tu as une valeur "signed" négative et que tu passes en unsigned, le comportement sera inattendu...
Idem, de l'autre côté, si tu as une valeur "unsigned" très élévé, en la passant en signed, tu auras aussi une comportement étrange (te retrouver avec une valeur négative par exemple).

Pour répondre à ta question, il n'y a pas de méthode sure. A toi de vérifier une par une les valeurs, afin de t'assurer qu'elle reste dans les bornes.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
7 avril 2011 à 00:14
salut,

La seule manière sûre est de savoir si les valeures min et max utilisées ne débordent pas dans les deux cas.

Autrement dit, tu peux passer de l'un à l'autre sans danger si ton interval utilisé est [0...127].

@++
0
Rejoignez-nous