OVH Cloud OVH Cloud

sscanf et unsigned char

13 réponses
Avatar
News
Bonjour,
je me pose une question concernant la lecture d'une chaîne avec
sscanf(buffer,"%02X",&byte);
je récupère donc un octet, que je veux mettre dans un unsigned char.
Mais gcc m'engueule en me disant : "format unsigned int, arg type
différent (arg 3)".
Seulement, récupérer, comme gcc préfère, dans un unsigned int (donc 4
octets) est plus emmerdant après, car on ne sait pas dans quel octet
c'est lu selon le little/big endian et ça peut faire n'importe quoi lors
du memcopy qui suit...

TP

3 réponses

1 2
Avatar
drkm
James Kanze writes:

"Charlie Gordon" writes:

|> unsigned int val;
|> unsigned char uc;
|> sscanf(buffer, "%02X", &val);
|> // les trois lignes suivantes sont équivalentes

Je mettrais bien un « assert( val ) <= UCHAR_MAX ) » ici.


Avec la chaîne de format employée, n'est-on pas certain de la
véracité de cette assertion ?

--drkm

Avatar
Charlie Gordon
"James Kanze" wrote in message
news:
"Charlie Gordon" writes:

|> "Emmanuel Delahaye" wrote in message
|> news:
|> > Charlie Gordon wrote on 23/11/04 :

|> > >> je récupère donc un octet, que je veux mettre dans un unsigned
|> > >> char.

|> > > uc = val & ((1 << CHAR_BIT) - 1);
vs: uc = val & 0xFF;

...
|> De toute facon CHAR_BIT >= 8, sscanf() n'a lu que 2 chiffres
|> hexadécimaux, et cette discussion est largement au delà des
|> compétences de l'OP, sans compter que je n'ai même pas testé le
|> résultat de sscanf(), ni même la pertinence du format %02X...

P't-êt' ben. Mais alors, si %02X signifie qu'on veut 8 bits, pourquoi
utiliser une expression complexe qui pourraient, sur certaines machines,
donner un résultat autre, plutôt qu'une expression simple et parlante
qui marche partout ?


Tout à fait d'accord... ma proposition était plutôt de l'ordre de l'ironie.

--
Chqrlie.

Avatar
James Kanze
drkm writes:

|> James Kanze writes:

|> > "Charlie Gordon" writes:

|> > |> unsigned int val;
|> > |> unsigned char uc;
|> > |> sscanf(buffer, "%02X", &val);
|> > |> // les trois lignes suivantes sont équivalentes

|> > Je mettrais bien un « assert( val ) <= UCHAR_MAX ) » ici.

|> Avec la chaîne de format employée, n'est-on pas certain de la
|> véracité de cette assertion ?

En effet. En supposant une implémentation conforme de la bibliothèque,
mais je ne crois pas que ce soit souvent un problème en C. J'avoue que
je ne avais pas régardé en détail le format utilisé.

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