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 :

Remplacement d'une valeur hexa dans une chaine


Sujet :

C++

  1. #1
    Membre régulier Avatar de raoulchatigre
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2004
    Messages : 99
    Points : 87
    Points
    87
    Par défaut Remplacement d'une valeur hexa dans une chaine
    Bonjour,

    J'ai un fichier formaté d'une manière très étrnage, parsemé de pas mal de caractères inconnus avec du ascii au milieu. Mon but c'est de délimiter l'ascii.
    Je cherche donc à repérer la valeur 0xe9 dans ma chaine mais les codes suivants n'aboutissent à rien.
    Je compile sous GNU C++ sur une linux redhat.

    Qui peut me corriger/me remettre sur la bonne voie ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      if(str_Buffer.find("\xe9",0) != string::npos){
    	cout<< "Trouvé !!"<<endl;
      }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      if(str_Buffer.find(0xe9,0) != string::npos){
    	cout<< "Trouvé !!"<<endl;
      }

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    L'ASCII est défini sur 7 bits.
    0xe9 nécessite 8 bits.

    Incompatibilité de tes différents propos.

    Si tu ne trouves rien, ça veut dire que l'octet 0xe9 ne se trouve pas dans la chaîne.
    Boost ftw

  3. #3
    Membre régulier Avatar de raoulchatigre
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2004
    Messages : 99
    Points : 87
    Points
    87
    Par défaut
    Arf, comment expliquer clairement.
    Le fichier source ne ressemble pas vraiment à un fichier normal, c'est plutôt un spool d'imprimante vraiment crade avec pleins de caractères étranges.

    0xe9 est la manière dont est codé le "é"
    vi/less/cout affichent un "@"
    emacs/notepad++ affichent un "é"

    et 0xb3 est mon délimiteur,
    vi/less/cout affichent un "@"
    emacs/notepad++ affichent un "au cube"

    Lorsque je fais afficher la string par via stdout, j'obtiens le caractère '@' pour 0xe9 et 0xb3. Jusqu'à présent le dev qui était avant moi se basait sur "@" comme délimiteur et ça marchait, mais maintenant que j'ai des "é" qui ressemblent à des "@" et mes délimiteurs ne veulent plus rien dire.

    J'aimerais lui donner un délimiteur en hexa pour être sur de chercher la bonne valeur mais je n'y parviens pas.

    En gros ce que je veux juste faire c'est avoir un char * avec la valeur de 0xb3.

    après tu parles de 7/8 bits, donc si j'ai un décalage, je suis peut-être à mille lieux de chercher...

  4. #4
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Je cherche donc à repérer la valeur 0xe9 dans ma chaine mais les codes suivants n'aboutissent à rien.
    Si dans ta chaine de caractères, tu recherches exactement la chaine "0xe9" alors tu dois faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(str_Buffer.find("0xe9",0) != string::npos){
    	cout<< "Trouvé !!"<<endl;
    }
    Mais peut être recherches tu tout simplement "e9" qui représente une valeur hexadécimale dans ton fichier, sans le "0x", alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(str_Buffer.find("e9",0) != string::npos){
    	cout<< "Trouvé !!"<<endl;
    }

  5. #5
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    En gros ce que je veux juste faire c'est avoir un char * avec la valeur de 0xb3.
    Si tu désires une chaine de caractères non modifiable contenant la valeur 0xb3 alors tu peux faire par exemple ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int valeur = 0xb3;
    const char *buf = malloc (sizeof(valeur)+1);
     
    sprintf(buf, "%x", valeur);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        int valeur = 0xb3;
     
        // créer un flux de sortie
        std::ostringstream oss;
        // écrire un nombre dans le flux
        oss << valeur;
        // récupérer une chaîne de caractères
        std::string result = oss.str();

  6. #6
    Membre régulier Avatar de raoulchatigre
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2004
    Messages : 99
    Points : 87
    Points
    87
    Par défaut
    merci homeostasie,
    on a pu faire de plus en plus de test jusqu'à comprendre qu'on faisait fausse piste.

    Le buje : il est là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!isascii(pOriginal[i])) pOriginal[i] = "@";
    Des fois j'ai envie de mordre les autres dev...

    Je viens d'avoir une nouvelle info de mon boss, le codage original c'est du DOS.
    Vous savez celui qu'on ouvre avec edit avec les zolis traits, etc...
    Il me semble que c'etait bien de l'ascii. je me trompe ?

    Enfin en tout cas on avance, merci à tous

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    0xe9 est la manière dont est codé le "é"
    é n'existe pas en ASCII.
    Par contre c'est bien 0xe9 dans ISO-8859-1, ISO-8859-15, Windows-1252, Unicode (mais qui nécessite un encodage particulier pour du 8 bit, ce qui fait que ça n'apparait pas comme étant 0xe9), et probablement d'autres que je ne connais pas.

    vi/less/cout affichent un "@"
    emacs/notepad++ affichent un "é"
    Ce que ces logiciels affichent dépend de leur configuration, de la configuration de ton système et de celle de ton terminal.

    Je viens d'avoir une nouvelle info de mon boss, le codage original c'est du DOS.
    Tu veux dire le codage OEM de Windows européen ? (CP850)

    C'est sûr que tu mélanges des codages (et des codages 8 bits en plus, le truc totalement obsolète) tu risques d'avoir du mal effectivemment.
    Si jamais tu veux internationaliser le programme, autant tout réecrire.
    Boost ftw

  8. #8
    Membre régulier Avatar de raoulchatigre
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2004
    Messages : 99
    Points : 87
    Points
    87
    Par défaut
    @loufoque : bingo
    en effet je mélange les encodages, après étude des Codepage sur wikipédia j'ai l'impression que le client qui nous fournit les fichiers a mélangé du Codepage 850 (ou un dérivé qui lui ressemble) avec de l'iso-latin-1.

    Pour l'histoire des "@" j'étais complètement à côté (cf précédent post)

    Bref je suis parti pour m'amuser un moment, mais maintenant que j'ai les armes en main, tout va plus êre rigolo

    merci

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  2. Réponses: 82
    Dernier message: 05/02/2011, 14h34
  3. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  4. Recupérer valeur hexa dans une chaine ASCII
    Par OjBarbare dans le forum ASP.NET
    Réponses: 3
    Dernier message: 22/04/2009, 09h50
  5. Réponses: 1
    Dernier message: 11/06/2008, 13h33

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