|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonjour à tous,
j'ai un problème, le code suivat : uint8_t data1, data2; cout << "0x" << hex << setw(4) << setfill('0') << data1 << "="; cout << "0x" << hex << setw(2) << setfill('0') << data2 << endl; me sort l'output suivant : 0x00aa=0x0 alors que je m'attendrais (et que je voudrais) quelque chose du genre: 0x00aa=0x00 Vous avez des idées? |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Guillaume GOURDIN <trash@hotmail.com> writes:
> Bonjour à tous, > > j'ai un problème, le code suivat : > > uint8_t data1, data2; > cout << "0x" << hex << setw(4) << setfill('0') << data1 << "="; > cout << "0x" << hex << setw(2) << setfill('0') << data2 << endl; > > me sort l'output suivant : > > 0x00aa=0x0 > > alors que je m'attendrais (et que je voudrais) quelque chose du genre: > > 0x00aa=0x00 > > Vous avez des idées? Ce qui me surprend, c'est la partie aa. uint8_t est vraissemblablement un typedef sur unsigned char et donc data1 et data2 devraient etre affiche comme des caracteres, si data2 est \0, c'est pas trop etonnant que tu ne le voie pas mais tu devrais etre capable de le verifier (piper dans od, sortir vers un fichier et regarder avec un editeur hexa,...) Essaie cout << "0x" << hex << setw(4) << setfill('0') << unsigned(data1) << "="; cout << "0x" << hex << setw(2) << setfill('0') << unsigned(data2) << endl; A+ -- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/...ite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
Jean-Marc Bourguet a écrit :
> Guillaume GOURDIN <trash@hotmail.com> writes: > >> Bonjour à tous, >> >> j'ai un problème, le code suivat : >> >> uint8_t data1, data2; >> cout << "0x" << hex << setw(4) << setfill('0') << data1 << "="; >> cout << "0x" << hex << setw(2) << setfill('0') << data2 << endl; >> >> me sort l'output suivant : >> >> 0x00aa=0x0 >> >> alors que je m'attendrais (et que je voudrais) quelque chose du genre: >> >> 0x00aa=0x00 >> >> Vous avez des idées? > > Ce qui me surprend, c'est la partie aa. uint8_t est vraissemblablement un > typedef sur unsigned char et donc data1 et data2 devraient etre affiche > comme des caracteres, si data2 est \0, c'est pas trop etonnant que tu ne le > voie pas mais tu devrais etre capable de le verifier (piper dans od, sortir > vers un fichier et regarder avec un editeur hexa,...) Et en plus, le resultat doit etre indefini, vu que data1 et data2 sont utilisés avant leur initialisation. On en a parlé ici il n'y a pas si longtemps ![]() > > Essaie > cout << "0x" << hex << setw(4) << setfill('0') << unsigned(data1) << "="; > cout << "0x" << hex << setw(2) << setfill('0') << unsigned(data2) << endl; Ca donne bien le resultat attendu (avec des variables correctement initialisees). A la premiere lecture, j'ai trouve etrange l'usage explicite du prefixe "0x", parce qu'on peut l'obtenir avec le manipulateur showbase (il faut aussi internal pour le remplissage). On devrait donc obtenir le resultat comme ceci : uint8_t data1 = 0xaa , data2 = 0x0 ; cout << setw(6) << setfill('0') << hex << showbase << internal << unsigned(data1) << "="; cout << setw(4) << setfill('0') << hex << showbase << unsigned(data2) << endl ; Et la j'obtient: 0x00aa=0000 A ma grande surprise, showbase n'ajoute pas le prefixe de base pour a valeur 0 ( il faut dire que ca ne sert a rien vu que 0 est commun a toutes les bases ). Jusqu'a present je pensais que le prefixe etait ajouté systematiquement, parce que je n'etait jamais tombé sur le cas particulier de 0, ni vu dans aucune doc qu'il y avait un comportement special. Avec printf, le comportement est identique : printf( "%#06x=%#04x", unsigned(data1), unsigned(data2) ) ; 0x00aa=0000 La, c'est quand meme plus clair, parce que le man printf(3) me dit que pour le caractere #, on a "For x and X conversions, a non-zero result has the string 0x (or 0X for X conversions) prepended to it." Les deux langages on le meme comportement, au fond, c'est pratique, mais est-ce que c'est standard ? |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
Michel Decima <michel.decima@orange-ft.com> writes:
| Jean-Marc Bourguet a écrit : | > Guillaume GOURDIN <trash@hotmail.com> writes: | > | >> Bonjour à tous, | >> | >> j'ai un problème, le code suivat : | >> | >> uint8_t data1, data2; | >> cout << "0x" << hex << setw(4) << setfill('0') << data1 << "="; | >> cout << "0x" << hex << setw(2) << setfill('0') << data2 << endl; | >> | >> me sort l'output suivant : | >> | >> 0x00aa=0x0 | >> | >> alors que je m'attendrais (et que je voudrais) quelque chose du genre: | >> | >> 0x00aa=0x00 | >> | >> Vous avez des idées? | > Ce qui me surprend, c'est la partie aa. uint8_t est | > vraissemblablement un | > typedef sur unsigned char et donc data1 et data2 devraient etre affiche | > comme des caracteres, si data2 est \0, c'est pas trop etonnant que tu ne le | > voie pas mais tu devrais etre capable de le verifier (piper dans od, sortir | > vers un fichier et regarder avec un editeur hexa,...) | | Et en plus, le resultat doit etre indefini, vu que data1 et data2 sont | utilisés avant leur initialisation. On en a parlé ici il n'y a pas si | longtemps ![]() sauf si uint8_t est un unsigned char :-) -- Gaby |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
Gabriel Dos Reis a écrit :
> Michel Decima <michel.decima@orange-ft.com> writes: > > | > Guillaume GOURDIN <trash@hotmail.com> writes: > | > > | >> Bonjour à tous, > | >> > | >> j'ai un problème, le code suivat : > | >> > | >> uint8_t data1, data2; > | >> cout << "0x" << hex << setw(4) << setfill('0') << data1 << "="; > | >> cout << "0x" << hex << setw(2) << setfill('0') << data2 << endl; > | Et en plus, le resultat doit etre indefini, vu que data1 et data2 sont > | utilisés avant leur initialisation. On en a parlé ici il n'y a pas si > | longtemps ![]() > > sauf si uint8_t est un unsigned char :-) Mmmh. parce que unsigned char ne peut pas avoir de 'trap value' ? |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
Michel Decima wrote on 07/03/2008 21:21:
> Gabriel Dos Reis a écrit : >> >> sauf si uint8_t est un unsigned char :-) > > Mmmh. parce que unsigned char ne peut pas avoir de 'trap value' ? voire parce qu'un type utilisateur influencerait le contenu mémoire ? Sylvain. |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
On 7 mar, 21:27, Sylvain <noS...@mail.net> wrote:
> Michel Decima wrote on 07/03/2008 21:21: > > Gabriel Dos Reis a écrit : > >> sauf si uint8_t est un unsigned char :-) > > Mmmh. parce que unsigned char ne peut pas avoir de 'trap value' ? > voire parce qu'un type utilisateur influencerait le contenu mémoire ? Le type influence bien comment on y accède. -- James Kanze (GABI Software) email:james.kanze@gmail.com Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
|
|
#8 |
|
Messages: n/a
Hébergeur: |
On 7 mar, 14:47, Michel Decima <michel.dec...@orange-ft.com> wrote:
> Jean-Marc Bourguet a écrit : > > Essaie > > cout << "0x" << hex << setw(4) << setfill('0') << unsigned(data1) << "="; > > cout << "0x" << hex << setw(2) << setfill('0') << unsigned(data2) << endl; > Ca donne bien le resultat attendu (avec des variables > correctement initialisees). A la premiere lecture, j'ai trouve > etrange l'usage explicite du prefixe "0x", parce qu'on peut > l'obtenir avec le manipulateur showbase (il faut aussi > internal pour le remplissage). On devrait donc obtenir le > resultat comme ceci : > uint8_t data1 = 0xaa , data2 = 0x0 ; > cout << setw(6) << setfill('0') > << hex << showbase << internal << unsigned(data1) << "="; > cout << setw(4) << setfill('0') > << hex << showbase << unsigned(data2) << endl ; > Et la j'obtient: > 0x00aa=0000 > A ma grande surprise, showbase n'ajoute pas le prefixe de base pour > a valeur 0 ( il faut dire que ca ne sert a rien vu que 0 est commun > a toutes les bases ). Jusqu'a present je pensais que le prefixe etait > ajouté systematiquement, parce que je n'etait jamais tombé sur le > cas particulier de 0, ni vu dans aucune doc qu'il y avait un > comportement special. > Avec printf, le comportement est identique : > printf( "%#06x=%#04x", unsigned(data1), unsigned(data2) ) ; > 0x00aa=0000 > La, c'est quand meme plus clair, parce que le man printf(3) me > dit que pour le caractere #, on a > "For x and X conversions, a non-zero result has the string > 0x (or 0X for X conversions) prepended to it." > Les deux langages on le meme comportement, au fond, c'est pratique, > mais est-ce que c'est standard ? Oui:-(. J'ai rencontré le même problème, il y a peu. Je l'ai résolu en sortant le "0x" explicitement. (À vrai dire, ça m'arrangeait, parce que je voulais l'x dans "0x" minuscule, mais les chiffres hex majuscule.) -- James Kanze (GABI Software) email:james.kanze@gmail.com Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
![]() |
| Outils de la discussion | |
|
|