OVH Cloud OVH Cloud

Printer une chaine en hexa ?

22 réponses
Avatar
Francois
Salut,

Quel est le masque à utiliser pour printer une chaine en hexa dans un
fichier ?

Où trouver une référence complète de ce que veut dire %08X , %02X etc... ?

Merci d'avance.

--
Francois.

10 réponses

1 2 3
Avatar
Pierre Maurette
[...]
Le bidule 'short', c'est pas portable (couic).
Non, pas portable, c'est volontaire :

assert(CHAR_BIT == 8);
assert(sizeof(short) == 2);
En fait, le seul but du bidule 'short' était de montrer le boutisme
(oui, je faisais un pari sur la machine de l'OP).

Pourquoi tous ces cast?
C'est pas plus simple de mettre le bon type ?
Ces fonctions sont dans mon idée et leur nom le montre destinées à

examiner une zone mémoire (qui peut être une simple variable). J'en ai
d'ailleurs un petit toolkit plus complet qui remplit bien son rôle
pédagogique.
Elle attend donc une adresse et une taille. Ce qui représente le mieux
une adresse en C, c'est le void*. En fait, j'ai hésité entre ce void*
qui complique un peu le code de la fonction, mais pas trop, il suffit de
char* ptr = (char*)bouffeur;
une fois, et un truc genre BYTE* (j'élimine le char*).
J'ai choisi le void*.

Il y a une fuite mémoire :
C'est clair, j'ai oublié le free(). Pas d'excuses.


--
Pierre

Avatar
Marc Boyer
James Kanze wrote:
Dans une documentation C ?
Les pages de man (Unix)
% man -s3C printf
% man -a printf


Ce qui ne donne pas forcement la documentation du printf de C.
(Au moins sur mon Unix, printf accepte des spécifications de
formattage du genre "%2$s" ; ce n'est pas du standard C.)


Une *bonne* documentation signalerait ce qui est
standard et ce qui ne l'est pas, mais on ne choisit
pas toujours sa documentation en ligne.

Un bouquin de C
J'ai longtemps utilisé le célèbre K&R
Mais actuellement, c'est ``C: a reference manual'', Samuel
P. Harbision et Guy L. Steele


Pour la bibliothèque aussi ?


Oui. Par exemple, on trouve 22 pages sur les E/S formatées.
Ca peut paraître beaucoup, mais quand on a tenté de lire
le tableau résumé du K&R, on apprécie de trouver les détails.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Yves ROMAN

Salut,

Quel est le masque à utiliser pour printer une chaine en hexa dans un
fichier ?
[...]



void HexDumpMemAsChars(const void* bouffeur, const size_t NbreChars)
{
int i;
char* ptr = (char*)bouffeur;


Ca serait pas plutot
unsigned char* ptr = (unsigned char*)bouffeur;
pour éviter les surprises en cas de valeurs négatives ?
(a moins que sur ton compilateur le char soit unsigned par defaut)

for(i = 0; i < (int)NbreChars; i++)
{
printf("%02X ", ptr[i]);
}
printf("n");
}




Avatar
Pierre Maurette
[...]
void HexDumpMemAsChars(const void* bouffeur, const size_t NbreChars)
{
int i;
char* ptr = (char*)bouffeur;



Ca serait pas plutot
unsigned char* ptr = (unsigned char*)bouffeur;
pour éviter les surprises en cas de valeurs négatives ?
(a moins que sur ton compilateur le char soit unsigned par defaut)
Bonne question. Vous avez raison.

Le but est d'examiner la mémoire.

* Si je veux l'afficher en décimal (%d), je suis obligé de préciser ma
demande et de spécifier 'signed char' ou 'unsigned char', 'char' étant
ambigu. Je mettrais si possible quelque chose comme int8_t ou uint8_t
(et même typedefer un sint8_t équivalent au int8_t).

* Mais je veux afficher en hexa. Dans mon idée, le spécificateur x ou X
affiche en 'unsigned int' donc une image bit à bit de la donnée. Mais
effectivement, la conversion en int et le fait que %02X ne tronque pas
m'avaient échappé et je n'avais pas fait de tests. Donc, pour éviter
d'afficher des FFFFFFD4, il faut spécifier 'unsigned char'. J'aurais
préféré régler le problème au niveau du printf(), mais je n'ai pas trouvé.
--
Pierre


Avatar
Antoine Leca
En news:424b0d16$0$11793$, Pierre Maurette va escriure:
[...]
Le bidule 'short', c'est pas portable (couic).
Non, pas portable, c'est volontaire :

assert(CHAR_BIT == 8);
assert(sizeof(short) == 2);


Pas suffisant: tu peux avoir des machines où le short négatif qui
"correspond" à zéro est une représentation piégée -- normalement, -32768 en
complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en
magnitude signée (0x8000).


Antoine


Avatar
Francois
Merci pour toutes vos réponses et références !

J'adore comme ce groupe est profilique sur chaque question posée :)

--
Francois.
Avatar
Pierre Maurette
En news:424b0d16$0$11793$, Pierre Maurette va escriure:

[...]

Le bidule 'short', c'est pas portable (couic).


Non, pas portable, c'est volontaire :
assert(CHAR_BIT == 8);
assert(sizeof(short) == 2);



Pas suffisant: tu peux avoir des machines où le short négatif qui
"correspond" à zéro est une représentation piégée -- normalement, -32768 en
complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en
magnitude signée (0x8000).
Merci.

Normalement, quelqu'un devrait maintenant demander "Ah bon, sur quelle
machine etc." ;-)
Les assert() dans un code testé/posté/effacé s'adressaient au lecteur,
dans le fol espoir d'éviter la remarque de portabilité. J'imagine que
pour faire de façon portable le même code il faut une usine à gaz (le
seul but de la version short de la fonction étant de mettre en évidence
le piège du boutisme s'il est petit).
Je devrais utiliser les types de stdint.h. S'ils existent, ils me
garantissent pas mal de trucs, non ? MAis le fait qu'ils puissent ne pas
exister suffira à faire passer le NG en mode -Wall ;-)
J'ai bien pensé précéder toutes mes tentatives de code par:
/* Code non-portable. Testé sur .... */
Mais avec la chance que j'ai et mon niveau en C, j'aurai alors droit à
"Et en quoi n'est-ce pas portable ?".
Reste la solution de ne rien poster, mais l'humanité se remettrait-elle
d'une telle perte ?
--
Pierre



Avatar
Charlie Gordon
"Pierre Maurette" wrote in message
news:424ac9d0$0$2853$
Pierre Maurette wrote:



Salut,

Quel est le masque à utiliser pour printer une chaine en hexa dans un
fichier ?


Votre question est un peu imprécise. "printer", c'est un néologisme à
base de printf() ou c'est pour imprimer sur l'imprimante?



Ne soyez pas trop tatillon, je suis sûr qu'il a voulu dire "displayer".
Au Québec, je suppose qu'on doit écrire "écranner", "tubecathodiquer"

étant admis pour déraisons hystériques.


Et pour les plus riches : elcéder et téheffter, voire dévéhir !

Chqrlie.




Avatar
Charlie Gordon
"Antoine Leca" wrote in message
news:d2goii$nft$
En news:424b0d16$0$11793$, Pierre Maurette va escriure:
[...]
Le bidule 'short', c'est pas portable (couic).
Non, pas portable, c'est volontaire :

assert(CHAR_BIT == 8);
assert(sizeof(short) == 2);


Pas suffisant: tu peux avoir des machines où le short négatif qui
"correspond" à zéro est une représentation piégée -- normalement, -32768 en
complément à 2 (0x8000), et « -0 » en complément à 1 (0xFFFF) ou en
magnitude signée (0x8000).


Sans doute, mais peux-tu seulement en citer une ?
Ces architectures sont bonnes pour la retraite dans les musées. Si vous en
connaissez, faites un geste pour le progrès informatique : débranchez-les !

Chqrlie.



Avatar
Hamiral
connaissez, faites un geste pour le progrès informatique : débranchez-les !


Vous avez une drôle de conception du progrès ...

1 2 3