OVH Cloud OVH Cloud

Conversion string vers char?

8 réponses
Avatar
bluebob
Bonjour,
y a t-il un moyen simple de convertir une string en char correspondant?
Exemple:
// encodage quoted-printable
string qp ="E0";
char c = trucQuiConvertit(qp);

Merci d'avance
Francis

8 réponses

Avatar
Guillaume Gourdin
y a t-il un moyen simple de convertir une string en char correspondant?
Exemple:
// encodage quoted-printable
string qp ="E0";
char c = trucQuiConvertit(qp);


Regarde du côté de c_str()

Avatar
Vincent Lascaux
y a t-il un moyen simple de convertir une string en char correspondant?


Non : string c'est une chaine de caracteres (ie un certain nombre de
caracteres). char c'est un caractere.

Exemple:
// encodage quoted-printable
string qp ="E0";
char c = trucQuiConvertit(qp);


Ici tu t'attends à ce que c valle quoi ? 'E', '0' ou autre chose ?

--
Vincent

Avatar
Vincent Richard

y a t-il un moyen simple de convertir une string en char correspondant?
Exemple:
// encodage quoted-printable
string qp ="E0";
char c = trucQuiConvertit(qp);


Si c'est pour décoder du "quoted-printable" :

string qp = "E0";
char c = (qp.length() >= 2) ? (qp[0] * 16 + qp[1]) : qp[0];

Si c'est pour obtenir un caractère à une position donnée :

string qp = "E0";
char c1 = qp[0]; // premier caractère
char c2 = qp[1]; // deuxième caractère

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

Avatar
bluebob
Le Thu, 29 Jan 2004 13:08:37 +0100, Vincent Richard a écrit :

Si c'est pour décoder du "quoted-printable" :

string qp = "E0";
char c = (qp.length() >= 2) ? (qp[0] * 16 + qp[1]) : qp[0];


Euh, merci mais j'ai pas tout compris...

Est ce que ceci parait correct?
#include <cstdlib>

char *qp = "E0";
char **reste;
cout << (char)(strtoul(QP, reste ,16)) << endl;

qui donne bien 'à' comme je veux.

Francis

Avatar
Vincent Richard

Est ce que ceci parait correct?
#include <cstdlib>

char *qp = "E0";
char **reste;
cout << (char)(strtoul(QP, reste ,16)) << endl;

qui donne bien 'à' comme je veux.


Oui, et ça fonctionne avec des chaînes de longueur quelconque.
Et la même chose "en C++" :

#include <sstream>
#include <iomanip> // il me semble ??

std::istringstream iss("E0");
int x = '?';

// Ranger dans 'x' la valeur décimal du caractère
iss >> std::hex >> x;

if (iss.fail() || x < 0 || x > 255)
; // erreur de conversion (caractère non valide...)

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

Avatar
bluebob
Le Thu, 29 Jan 2004 14:07:48 +0100, Vincent Richard a écrit :

Et la même chose "en C++" :
,,,


Ok, merci

Francis

Avatar
kanze
Vincent Richard wrote
in message news:<4019056b$0$24015$...

Est ce que ceci parait correct?



Je ne crois pas.

#include <cstdlib>

char *qp = "E0";
char **reste;
cout << (char)(strtoul(QP, reste ,16)) << endl;

qui donne bien 'à' comme je veux.



Oui, dans ce cas précis. Mais si le but est de décrypter du « quoted
printable », il faut que tu restreins l'entrée à deux caractères. Ce que
ne fait pas strtoul. Essaie donc avec "E0A". Si j'ai bien compris ce que
tu veux, ça doit donner 'à', avec reste point à l''A'. Or que ça
donnerait 'n', avec reste qui pointe au '' de la fin de la chaîne.

Oui, et ça fonctionne avec des chaînes de longueur quelconque.


Ce qui est probablement un problème.

Et la même chose "en C++" :


Y compris le même problème.

#include <sstream>
#include <iomanip> // il me semble ??

std::istringstream iss("E0");
int x = '?';

// Ranger dans 'x' la valeur décimal du caractère
iss >> std::hex >> x;

if (iss.fail() || x < 0 || x > 255)
; // erreur de conversion (caractère non valide...)


Si je ne me trompe, « quoted printable » comporte toujours deux octets
par caractère. Quelque chose comme le suivant pourrait donc faire
l'affaire :

std::string
fromQuotedPrintable( std::string const& source )
{
std::string result ;
std::string::const_iterator
current = source.begin() ;
std::string::const_iterator
end = source.end() ; ;
while ( current != end ) {
if ( *current != '=' ) {
result += *current ++ ;
} else if ( end - current < 3 ) {
// ERROR...
result += *current ++ ;
} else {
std::istringstream s(
std::string( current + 1, current + 3 ) ) ;
s.setf( std::ios::hex, std::ios::basefield ) ;
unsigned u ;
s >> u ;
if ( ! s || s.get() != EOF ) {
// ERROR...
result += *current ++ ;
} else {
result += static_cast< char >( u ) ;
current += 3 ;
}
}
}
return result ;
}

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
bluebob
Le Fri, 30 Jan 2004 00:49:37 -0800, kanz a écrit :


Oui, dans ce cas précis. Mais si le but est de décrypter du « quoted
printable », il faut que tu restreins l'entrée à deux caractères. Ce que
ne fait pas strtoul. Essaie donc avec "E0A". Si j'ai bien compris ce que
tu veux, ça doit donner 'à', avec reste point à l''A'. Or que ça
donnerait 'n', avec reste qui pointe au '' de la fin de la chaîne.


Oui, bien sûr!
Mais mon problème était simplement la "transformation" de la représentation
sous forme "string" d'un caractère encodé en quoted-printable, en char.
d'où l'exemple: "E0" -> 'à'

Merci à tous de vous être penchés sur mon problème.

Francis