IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

char et unsigned char


Sujet :

C++

  1. #1
    Membre �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par d�faut char et unsigned char
    bonjour a tous !
    je voulais savoir quelle etait exactement la difference entre les char et les unsigned char ? je realise un prog de cryptographie avec openssl, et la plupart des fonctions utilisent des unsigned char. j'ai suppose que c'etait parce que ca faisait pile un octet et que donc ca pouvait "caster" n'importe quel contenu, et qu'on aurait aussi bien pu employer des char. jusqu'a ce que j'essaie de faire un printf pour afficher la cle en hexadecimal ( la cle en qustion est en char) en repompant le code sur le site d'open SSL :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    for (i=0;i< longueur;i++)
    {
            printf("%02X", cle[i]);
    }
    et j'obtiens un truc tout chelou, le resultat est bon mais il ya plein de "FFFF" au milieu. donc pour verifier j'ai fait :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    for (i=0;i< longueur;i++)
    {
              printf("%02X", (unsigned char )cle[i]);
    }
    et la le resultat est bon. et j'avoue que je ne comprends pas du tout pourquoi !

    et ca me fait un peu peur parce que j'arrete pas de faire des cast dans mon programme notamment pour pouvoir utiliser les fonctions string, genre strcpy ou strlen. normalement, ca ne change que "l'interpretation" de la variable et pas son contenu au sens binaire, du moins c'est ce que j'espere .....

    qqn pourrait il m'eclairer sur cette mysterieuse difference, et me dire si c'est une connerie de faire tous ces cast ?

  2. #2
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Il existe en fait 3 types diff�rents : char, unsigned char et signed char. Une impl�mentation est libre de dire qu'un char est �quivalent soit � signed char, soit � unsigned char (m�me si d'apr�s James Kanze, c'est assez rare qu'une impl�mentation d�finisse char en tant qu'unsigned char, de fa�on � �tre bug-compatible avec des vieux codes).

    Une r�gle de codage que je trouve pas mal est d'utiliser char pour des caract�res (et dont on se moque de la velaur num�rique �quivalente), et soit unsigned char, soit signed char selon les cas pour des entiers de petite taille.

    Tant qu'on a que des chars, pas de diff�rences visibles. Mais quand on cast en int, alors si char==unsigned char, 0xFF devient 0x000000FF, mais si char == signed char, alors 0xFF devient -1, c'est � dire 0xFFFFFFFF.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  3. #3
    Membre �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par d�faut
    ok, et donc tu penses que dans mon cas ( ou je manipule des blocs d'octet sans signification pour mon prog ), je peux passer de l'un a l'autre sans risque ? et quid du probleme d'affichage ? c'est que printf passe par la valeur numerique entiere ? moi je voullais de l'hexa simplement comme une commodite de lecture. mais en fait je viens de penser que pour afficher de l'hexa, il est oblige de considerer les octets comme des entier. je pensais q'uil allait simplement prendre les octets 2 par 2 et faire une conversion nombre en base 2 -> nombre en base 16 ( reflexe de matheux... ), donc qu'il allait interpreter le code binaire comme en math :

    101b -> (1*1 + 0*2 + 1 * 2^2 )d

    mais en fait il peut effectivement y avoir un signe ...

  4. #4
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Je ne connais pas printf, mais le doc que je viens de chercher indique :
    X Unsigned hexadecimal integer (capital letters)

    Je me demande donc si la raison n'est pas pire encore : Tu promets � printf que tu vas lui passer un int, et tu lui passe un char. Il va compl�tement s'y perdre dans ses pointeurs internes...

    C'est ce genre de d�tails scabreux qui fait que je n'utilise jamais printf.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  5. #5
    Membre chevronn�
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Par d�faut
    Citation Envoy� par jobherzt
    ok, et donc tu penses que dans mon cas ( ou je manipule des blocs d'octet sans signification pour mon prog ), je peux passer de l'un a l'autre sans risque ?
    Selon moi, pour une telle application, mieux vaut utiliser TOUT LE TEMPS des unsigned char. D'ailleurs j'utilise �� :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    typedef unsigned char BYTE;
    C'est un type g�n�rique en prog Windows mais je le d�finis m�me si je n'utilise pas le SDK Win32... Je pense que �� clarifie les choses et tu ne risqueras pas de faire d'erreurs...

    Pour la question de l'affichage, on est en C++ cout, et non printf

  6. #6
    Membre �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par d�faut
    ouais, je sais printf c'est la premiere fois de ma vie que je l'utilise, et c'est vraiment pour la deco. le programme final n'aura pas besoin d'afficher la cle. cout est capable de sortir de l'hexadecimal ? et accessoirement, j'utilise tjrs des unsigned char, sauf que des fois je fais des trucs genre :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    int longueur = strlen((char*) truc);
    ca me simplifie la vie ....

  7. #7
    Membre �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par d�faut
    au fait, je viens d'essayer cout << hex <<key[i] pour respecter les standards ( j'aime bien ca !! ) mais ca ne s'applique qu'aux entier. alors je cast, genre un tableau unsigned char de 128 elements devient un tableau d'entier de 32 elements. c'est un peu lourd, alors si qqn a qqchoses a propser ....

  8. #8
    Membre �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par d�faut
    et pour joyloic, l'exemple,avec printf est pompe sur le site de openssl, moi non plus je n'y connais rein en printf. mais il me semble que le 02 sert plus ou moins a lui indiquer la taille de ce que je lui balance, et d'ailleurs ca marchait nickel avec des unsigned char. alors ce que le 02 signifie exactement, ca mystere ..
    [/b]

  9. #9
    Membre chevronn�
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Par d�faut
    Oh, le 02 veut dire "affichage de 2 caract�res de large, et compl�ter avec des Z�ros si �� fait moins de 2 caract�res de large". Quand au X c'est pour hexad�cimal oui.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 03/04/2009, 17h46
  2. R�ponses: 9
    Dernier message: 16/07/2008, 11h01
  3. [Cl� de registre] Conversion char* vers unsigned char*
    Par The Lord of Nesquik dans le forum C
    R�ponses: 7
    Dernier message: 03/07/2006, 23h30
  4. Types : char vs. unsigned char
    Par Herode dans le forum C++
    R�ponses: 3
    Dernier message: 15/02/2006, 21h39
  5. vector<unsigned char> et unsigned char* : conversion ?
    Par zax-tfh dans le forum SL & STL
    R�ponses: 5
    Dernier message: 15/01/2006, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo