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
Marc Boyer
In article <424aa235$0$18943$, Francois wrote:
Salut,

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


Je ne pense pas qu'il en existe. Ce que je sais faire, c'est
écrire des entiers en hexa l'un aprèe l'autre.

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


Dans une documentation C ?
Les pages de man (Unix)
% man -s3C printf
% man -a printf
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



--
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
Antoine Leca
En news:424aa235$0$18943$, Francois va escriure:
Quel est le masque à utiliser pour printer une chaine en hexa dans
un fichier ?


% [les drapeaux] x
% [les drapeaux] X

Le premier utilise des minuscules, l'autre des capitales.


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



Tout plein d'endroits.
Pour ce que tu veux faire:

Groupe1:
- justifie à gauche
# force 0x/0X à gauche
0 justifie avec des zéros à gauche au lieu d'espaces

Groupe2 (largeur mini)
n (n'importe quel nombre) au moins n caractères
* la largeur est lue dans un argument entier passé avant le nombre à
imprimer

Groupe3 ("précision")
.n au moins n _chiffres_, complétés avec des
0 à gauche si besoin est.
.* la précision est lue dans un argument entier passé avant le nombre à
imprimer
. supprime l'affichage de la valeur 0

Groupe4 (type de l'argument; seuls les deux premiers sont supportés
partout):
h unsigned short
l unsigned long
hh unsigned char
ll unsigned long long
j size_t
I64 unsigned __int64 (chez Microfou *uniquement*)


%08x est l'équivalent de %.8x (et est normalement le signal que le code en
question va avoir des problèmes si les int font moins de 32 bits).

J'ai trouvé des "%08.8x" (probablement pour être compatible avec d'anciennes
incantations), des "0x%08.8x" et même "0x0%08.8x". Sans y voir bien
l'intérêt, sauf celui de compliqué. En gros, quand tu vois "%0nX" ou
"%n.nX", cela veut dire que cela sera de largeur fixe avec tout plein de
zéros; ce qui est généralement recherché.


Antoine

Avatar
Antoine Leca
En news:d2e97i$9j8$, Marc Boyer va escriure:
In article <424aa235$0$18943$, Francois wrote:
Quel est le masque à utiliser pour printer une chaine en hexa dans
un fichier ?


Je ne pense pas qu'il en existe.


Effectivement, je me suis emporté, je n'avais pas tout bien lu.


Antoine


Avatar
Pierre Maurette
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?
Dans le second cas, il me semble que c'est souvent galère sous un OS
moderne. Essayez de changer les printf(blabla) soit en fprintf(stdprn,
blabla), soit en fprintf(nom_imprimante, blabla), avec:
FILE* nom_imprimante = fopen("LPT1", "w");
Si ça ne marche pas, essayez de remplacer LPT1 par LPT2, ou PRN, ou un
truc dans le genre de USBxx, je ne me souviens plus exactement.
Vous dite "dans un fichier". Là aussi, une des solutions est la même que
la précédente:
FILE* MonFichier = fopen("nomfichier", "wt");
fprintf(MonFichier, blabla);

Mais j'imagine que le problème est dans le "blabla", c'est à dire dans
la chaine de format. Une chaîne (de caratères, je suppose) est une suite
de char. A ma connaissance, vous ne pouvez convertir en texte hexa que
des entiers.

Vous pouvez vous faire un petit truc pour afficher de la mémoire, c'est
toujours sympa quand on est curieux:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <string.h>

#define TailleTableau (size_t)12

void HexDumpMemAsChars(const void* bouffeur, const size_t NbreChars)
{
int i;
char* ptr = (char*)bouffeur;
for(i = 0; i < (int)NbreChars; i++)
{
printf("%02X ", ptr[i]);
}
printf("n");
}

void HexDumpMemAsShorts(const void* bouffeur, const size_t NbreChars)
{
int i;
short* ptr = (short*)bouffeur;
for(i = 0; i < (int)NbreChars / 2; i++)
{
printf("%04X ", ptr[i]);
}
if((NbreChars % 2) != 0)
{
printf("%02X ", ((char*)bouffeur)[i + 3]);
}
printf("n");
}

int main(void)
{
char nom[] = "abcdefg";
char* tab = (char*)malloc(TailleTableau);

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

HexDumpMemAsChars(nom, strlen(nom));
HexDumpMemAsShorts(nom, strlen(nom));

HexDumpMemAsChars(tab, TailleTableau);
HexDumpMemAsShorts(tab, TailleTableau);

return 0;
}

Nota: ptr n'est pas indispensable, on peut caster le void*. Le cast du
malloc() est mal vu. La zone pointée par tab n'est pas initialisée.


Où trouver une référence complète de ce que veut dire %08X , %02X etc... ?
J'ai utilisé pas mal de sources, dont la norme (un PDF trouvé par hasard

sur la toile, pas vraiment légal). Actuellement, je sui branché sur ...
Visual Studio 2005. C'est tout à fitexploitble pour du C et du C++
standard. En lignez ici:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/vclrfMThroughR.asp
http://minilien.com/?dTbEND9hT3
(cliquez sur printf à gauche, puis sur "Format specifications" dans le
texte, et naviguez.
--
Pierre

Avatar
Harpo
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".

--
Patrick http://patrick.davalan.free.fr/


Avatar
Harpo
Marc Boyer wrote:


Dans une documentation C ?
Les pages de man (Unix)
% man -s3C printf
% man -a printf


Si on a un système plus exotique, sur google, avec "printf" et "manual",
on peut trouver par exemple :

http://dell5.ma.utexas.edu/cgi-bin/man-cgi?printf+3

--
Patrick http://patrick.davalan.free.fr/

Avatar
Pierre Maurette
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.
--
Pierre



Avatar
James Kanze
Marc Boyer wrote:
In article <424aa235$0$18943$, Francois wrote:


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



Je ne pense pas qu'il en existe. Ce que je sais faire, c'est
écrire des entiers en hexa l'un aprèe l'autre.


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



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.)

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 ?

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


Avatar
Emmanuel Delahaye
Francois wrote on 30/03/05 :
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.


Le Kernighan & Ritchie explique ça très bien. Sinon n'importe quelle
bonne référence sir le C comme

The C-library: http://www.dinkumware.com/refxc.html

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"Mal nommer les choses c'est ajouter du malheur au
monde." -- Albert Camus.

Avatar
Emmanuel Delahaye
Pierre Maurette wrote on 30/03/05 :
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <string.h>

#define TailleTableau (size_t)12

void HexDumpMemAsChars(const void* bouffeur, const size_t NbreChars)
{
int i;
char* ptr = (char*)bouffeur;
for(i = 0; i < (int)NbreChars; i++)
{
printf("%02X ", ptr[i]);
}
printf("n");
}

int main(void)
{
char nom[] = "abcdefg";
char* tab = (char*)malloc(TailleTableau);

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

HexDumpMemAsChars(nom, strlen(nom));
HexDumpMemAsChars(tab, TailleTableau);

return 0;
}


Le bidule 'short', c'est pas portable (couic). Pourquoi tous ces cast?
C'est pas plus simple de mettre le bon type ?

Il y a une fuite mémoire :

SYSALLOC Overload (10 rec)
SYSALLOC Successful initialization: 10 records available
SYSALLOC 'M 008C0600 12 4294967295 25:main.c'
61 62 63 64 65 66 67
00 00 00 00 00 00 00 00 00 00 00 00
SYSALLOC minB94967295 maxB94967295 delta=0
SYSALLOC Err: Not-matched list:
SYSALLOC Bloc 008C0600 (12 bytes) malloc'ed at line 25 of 'main.c' not
freed
SYSALLOC Released Memory
Appuyez sur une touche pour continuer . . .

Mise au point

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

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

int main (void)
{
size_t const TailleTableau = 12;
char nom[] = "abcdefg";
char *tab = malloc (TailleTableau);

if (tab != NULL)
{
HexDumpMemAsChars (nom, strlen (nom));
HexDumpMemAsChars (tab, TailleTableau);
free (tab), tab = NULL;
}
return 0;
}

SYSALLOC Overload (10 rec)
SYSALLOC Successful initialization: 10 records available
SYSALLOC 'M 008C0600 12 4294967295 23:main.c'
61 62 63 64 65 66 67
00 00 00 00 00 00 00 00 00 00 00 00
SYSALLOC 'F 008C0600 0 4294967295 29:main.c'
SYSALLOC 008C0600 matched
SYSALLOC minB94967295 maxB94967295 delta=0
SYSALLOC All-matched
SYSALLOC Released Memory
Appuyez sur une touche pour continuer . . .

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"Clearly your code does not meet the original spec."
"You are sentenced to 30 lashes with a wet noodle."
-- Jerry Coffin in a.l.c.c++

1 2 3