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 :

problème d'affichage d'hexa


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Par défaut problème d'affichage d'hexa
    Bonjour à tous, il est possible que ce soit très facile à régler, mais je n'ai pas trouvé la solution. Je dois afficher les valeurs hexa de certaines zones d'un texte, et si tout se passe bien lors de l'affichage de certaines valeurs (on affiche bien 20 pour un espace), des chaînes de f sont introduites dans l'affichage pour d'autres valeurs.
    Un exemple:

    ffffffc9ffffff921129;
    correspond à l'affichage de:

    É’)
    alors que j'aimerai obtenir (ce qui me semble aussi plus logique):

    c9921129;

    J'utilise la fonction fprintf comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    if (position==3)
              {
              for (i=0;i<=1;i++)
                  {
                  if (ligne[cpt]==10)
                     {
                     fprintf(fOut2,"%2x",ligne[cpt]);
                     position=1004;
                     cpt++;
                     }              
                  if (ligne[cpt]!=10)
                     {
                     fprintf(fOut2,"%2x",ligne[cpt]);
                     position=4;
                     cpt++;
                     }
     
                  }
    j'aimerai bien éviter de devoir faire encore un post traitement au fichier pour effacer les chaînes de ff qui m'embêtent.

    Merci d'avance.

    PS: (je sens que je vais avoir honte avec la réponse )

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Bonjour

    Si je ne me trompe pas, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fOut2,"%2x",(unsigned int) ligne[cpt]);
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre éprouvé Avatar de kaisse
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 100
    Par défaut
    En fait, c'est tout con: par défaut, dans ton implémentation, tes char sont signed. Donc pour ceux qui ont des valeurs supérieures à 127, ils ont en fait une valeur négative. Donc quand tu souhaites afficher leur valeur en hexadécimale avec %x, il y a conversion en int (je crois), et donc, par complémentaire à deux, tous les octets qui n'étaient pas dans le char, sont transformés en ff (typiquement). En gros, en supposant que ton char est sur 8 bits, et ton int sur 32, ca donne ca:

    Tu veux afficher:
    et tu affiches en fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    11111111 11111111 11111111 10011011
    Donc, tu affiches 6 f en trop.

    Pour résoudre, rien de plus simple: tu déclares des unsigned char au lieu de simples char. (certains compilateurs proposent d'avoir les char unsigned par défaut, par exemple, l'option -funsigned-char avec gcc, mais mieux vaut miser sur la portabilité).

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Par défaut
    Merci, j'ai compris parfaitement le problème, on va dire que c'était à cause du lundi matin. En fait, j'ai fait un mix entre vos deux propositions, puisque j'ai en fait choisi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fOut2,"%2x",(unsigned char) ligne[cpt]);
    Merci encore, et à bientôt sans doutes

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ulukahio
    Merci, j'ai compris parfaitement le problème, on va dire que c'était à cause du lundi matin. En fait, j'ai fait un mix entre vos deux propositions, puisque j'ai en fait choisi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fOut2,"%2x",(unsigned char) ligne[cpt]);
    C'est pas bon. "%x" attend un unsigned int. Il faut donc mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fOut2,"%2x",(unsigned) (unsigned char) ligne[cpt]);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (void)
    {
       char s[20];
     
       size_t i;
     
       for (i = 0; i < sizeof s; i++)
       {
          s[i] = 120 + i;
       }
     
       for (i = 0; i < sizeof s; i++)
       {
          printf ("%02X ", s[i]);
       }
       printf ("\n");
     
       for (i = 0; i < sizeof s; i++)
       {
          printf ("%02X ", (unsigned) (unsigned char) s[i]);
       }
       printf ("\n");
     
     
       system ("pause");
       return 0;
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Par défaut
    Et qu'est ce que ça change exactement? C'est abslument pas que je veuille mettre ta parole en doute, mais je veux bien tout comprendre... Surtout que quand j'applique ce que tu mets ((unsigned) (unsigned char)) ça me renvoie exactement le même résutlat (qui est celui que je veux obtenir) que (unsigned char) sans rien avant, et ce sans aucune erreur ni warning pour les deux codes.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ulukahio
    Et qu'est ce que ça change exactement?
    Un unsigned char n'est pas un unsigned int.
    C'est absolument pas que je veuille mettre ta parole en doute, mais je veux bien tout comprendre...
    Ma parole n'a rien à voir. C'est la norme.

    Il n'y a pas forcément de différence visible sur ta plateforme, mais ailleurs ou dans d'autres conditions, qui sait. A moins que la norme dise qu'un unsigned char est promu en unsigned int, mais à ma connaissance, ce n'est pas le cas.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Par défaut
    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'affichage
    Par mustang-gx dans le forum Bases de données
    Réponses: 8
    Dernier message: 26/01/2005, 22h54
  2. Problème d'affichage avec trace
    Par WriteLN dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2003, 16h59
  3. [Kylix] problème d'affichage
    Par scalvi dans le forum EDI
    Réponses: 1
    Dernier message: 18/06/2003, 10h07
  4. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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