# C++ std:string en hexadécimal ?

**URL:** <https://www.debian-fr.org/t/c-std-string-en-hexadecimal/52423>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 11:15 UTC](https://www.debian-fr.org/t/c-std-string-en-hexadecimal/52423 "2016-02-21T11:15:52Z")\
**Posts on this page:** 7\
**Page:** 2

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 11:17 UTC](https://www.debian-fr.org/t/c-std-string-en-hexadecimal/52423/21 "2016-02-21T11:17:36Z")

</div>

Déjà, commence par utiliser des std::string au lieu de chaînes C. Ça t’évitera de te planter en comptant plus ou moins de caractères qu’il n’y en a en réalité (les zéro à la fin…).

`std::string path = "Ma�anaDB.pdb (codage non valide)";
path = (*p_connect).esc_raw(path);`

> [@panthere](#):
>
> //je supose que .c\_str() devrai faire l’affaire seulement …

Non !  
.c\_str() te retourne une chaîne encodée (normalement la même que path après esc\_raw), pour la décoder et retrouver ta valeur d’origine il faut utiliser binary\_string :

```auto
std::string valeur = pqxx::binary_string((*cit)[countcol]).str();
```

---

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 21, 2016, 11:17 UTC](https://www.debian-fr.org/t/c-std-string-en-hexadecimal/52423/22 "2016-02-21T11:17:37Z")

</div>

[quote=“syam”]Déjà, commence par utiliser des std::string au lieu de chaînes C. Ça t’évitera de te planter en comptant plus ou moins de caractères qu’il n’y en a en réalité (les zéro à la fin…).

`std::string path = "Ma�anaDB.pdb (codage non valide)";
path = (*p_connect).esc_raw(path);`  
[/quote]  
Euh non sa veux pas parce que:

```auto
error: no matching function for call to ‘pqxx::basic_connection<pqxx::connect_direct>::esc_raw(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)’
```

j’editer le poste plus haut mai t’a du passer juste avant 😉

j’ai donc fait a la place

```auto
char my_str[]="Ma�anaDB.pdb (codage non valide)";
int l_my_str = sizeof(my_str);

//buffer1[0] = 0x89;

const std::string Esc = (*p_connect).esc_raw(reinterpret_cast <const unsigned
char *> (&my_str), l_my_str);
```

j’ai une erreur de compile avec le scond code que tu ma donner

```auto
std::string valeur = pqxx::binary_string((*cit)[countcol]).str();
error: ‘pqxx::binary_string’ has not been declared|
```

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 11:17 UTC](https://www.debian-fr.org/t/c-std-string-en-hexadecimal/52423/23 "2016-02-21T11:17:37Z")

</div>

Pour l’appel du esc\_raw(const std::string&) l’objet à utiliser est la transaction (pqxx::transaction) et non pas la connexion (pqxx::basic\_connection) – j’ai pas fait gaffe sur le coup.  
Pour binary\_string c’est aussi une erreur de ma part, en réalité c’est binarystring sans underscore entre les deux.

Pour t’y retrouver facilement dans la doc : [pqxx.org/devprojects/libpqxx/doc … /main.html](http://pqxx.org/devprojects/libpqxx/doc/stable/html/Reference/main.html)  
Onglet “Classes” =\> toutes les classes définies par la lib  
Une fois que tu es sur ces onglet, il y a un sous-onglet “Class Members” qui liste toutes les méthodes par ordre alphabétique, en indiquant à quelle(s) classe(s) chacune appartient.  
Faut jamais oublier que la programmation, c’est avant tout savoir lire la doc… 😉

---

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 21, 2016, 11:17 UTC](https://www.debian-fr.org/t/c-std-string-en-hexadecimal/52423/24 "2016-02-21T11:17:38Z")

</div>

[quote=«&nbsp;syam&nbsp;»]Pour l’appel du esc\_raw(const std::string&) l’objet à utiliser est la transaction (pqxx::transaction) et non pas la connexion (pqxx::basic\_connection) – j’ai pas fait gaffe sur le coup.  
Pour binary\_string c’est aussi une erreur de ma part, en réalité c’est binarystring sans underscore entre les deux.

Pour t’y retrouver facilement dans la doc : [pqxx.org/devprojects/libpqxx/doc … /main.html](http://pqxx.org/devprojects/libpqxx/doc/stable/html/Reference/main.html)  
Onglet «&nbsp;Classes&nbsp;» =\> toutes les classes définies par la lib  
Une fois que tu es sur ces onglet, il y a un sous-onglet «&nbsp;Class Members&nbsp;» qui liste toutes les méthodes par ordre alphabétique, en indiquant à quelle(s) classe(s) chacune appartient.  
Faut jamais oublier que la programmation, c’est avant tout savoir lire la doc… 😉[/quote]

arf la doc ,ta pas idée de la quantité que j’ai lu en 4 jours certes en traver … ![:101](https://www.debian-fr.org/uploads/default/original/1X/1b91d67e0290dc638aa72d87f05d6cee4a61d04e.gif "yeux-roulent") ![:101](https://www.debian-fr.org/uploads/default/original/1X/1b91d67e0290dc638aa72d87f05d6cee4a61d04e.gif "yeux-roulent") ![:101](https://www.debian-fr.org/uploads/default/original/1X/1b91d67e0290dc638aa72d87f05d6cee4a61d04e.gif "yeux-roulent") et c’est bien la le problème 😕  
la doc je commence a la connaitre ,mai pas forcement l’appliquer ![:doh:](https://www.debian-fr.org/uploads/default/original/1X/78536cf08b5cbccb06a10e44ddb8da50bfc1554d.gif "Doh!")

sinon c’ette fois on dirait que c’est bon.

```auto
					valeur = pqxx::binarystring((*cit)[countcol]).str();
					std::cout <<valeur << deco ;
```

la sortie est identique. bon il va faloire que je trie le bor\*el que j’ai fait dans mes sources ![:033](https://www.debian-fr.org/uploads/default/original/1X/42cd8bd0447ecac24cdff1e26fa990a5c8442791.gif "petard")

Merci du coup de pouce , tu ma enlever une sacrée épine ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK") ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")  
je te dirait si sa passe les teste ce soire

---

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 21, 2016, 11:17 UTC](https://www.debian-fr.org/t/c-std-string-en-hexadecimal/52423/25 "2016-02-21T11:17:40Z")

</div>

Finalement il y a un petit souci qui c’est rajouter:

```auto
//en bref la déclaration de la fonction
void cSqlPqxx::InsertTPrincipal(const int & exist,const std::string & datescan,
									 const std::string & path)

std::cout << "===============Path====>"<< path << std::endl;
//le resulta(donnée) est pris a l'execution
const char * my_str = path.c_str();
size_t l_my_str = path.size();
//le resulta(donnée) est pris a la compilation
/*char my_str[]="/home/taz/Test/Ma�naDB.pdb";
int l_my_str = sizeof(my_str);*/
```

Je vai essayer de faire simple,mai quand c est compliquer :S

dans le premier cas, le path reçois la string directement du disque a l’execution puisque passe en paramettre. du coup le resulta est pas le meme et évidament est faux:

dans le 2 resulta est ok:

très certainement parce que c’est l’utf8 du fichier (le \*.cpp) de la compilation qui est pris en compte.

donc retour a la case dépar  
le code suivant :

```auto
const char * my_str = path.c_str();
size_t l_my_str = path.size();
```

devrai être juste. puisque passer en paramettre, cepandant la conversion string char pose probleme , ou alors c’est plus loins dans la db que sa colle pas ?

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 11:17 UTC](https://www.debian-fr.org/t/c-std-string-en-hexadecimal/52423/26 "2016-02-21T11:17:41Z")

</div>

[quote=“panthere”]le code suivant :

```auto
const char * my_str = path.c_str();
size_t l_my_str = path.size();
```

devrai être juste. puisque passer en paramettre, cepandant la conversion string char pose probleme , ou alors c’est plus loins dans la db que sa colle pas ?[/quote]  
Oui ça devrait être bon. std::string se contrefout que tu sois en UTF-8, en ISO-8859 ou n’importe quoi d’autre, pour lui une chaîne c’est juste une séquence d’octets.  
Faudrait voir ce que contient la variable path, et quelle est sa longueur :

```auto

```

Éventuellement écris aussi la variable dans un fichier, pour que tu puisses l’éditer en hexa et voir _exactement_ quels caractères elle contient.

Le tout avant stockage dans la DB, et après l’avoir relu.

---

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 21, 2016, 11:17 UTC](https://www.debian-fr.org/t/c-std-string-en-hexadecimal/52423/27 "2016-02-21T11:17:42Z")

</div>

[quote=“syam”][quote=“panthere”]le code suivant :

```auto
const char * my_str = path.c_str();
size_t l_my_str = path.size();
```

devrai être juste. puisque passer en paramettre, cepandant la conversion string char pose probleme , ou alors c’est plus loins dans la db que sa colle pas ?[/quote]  
Oui ça devrait être bon. std::string se contrefout que tu sois en UTF-8, en ISO-8859 ou n’importe quoi d’autre, pour lui une chaîne c’est juste une séquence d’octets.  
Faudrait voir ce que contient la variable path, et quelle est sa longueur :

```auto

```

Éventuellement écris aussi la variable dans un fichier, pour que tu puisses l’éditer en hexa et voir _exactement_ quels caractères elle contient.

Le tout avant stockage dans la DB, et après l’avoir relu.[/quote]  
dans un fichier ? … euh je croit pas que sa soie d’une utiliter , vu que j’avais tenter en debut de post de le faire, et que sur differente machine la valeur change. sinon la longueur renvoiyée est de 27 .

[Page précédente](https://www.debian-fr.org/t/c-std-string-en-hexadecimal/52423.md?page=1)
