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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 50
    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 : 50
    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