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++Builder Discussion :

Convertir un texte de 8 caractères en 4 octets BCD


Sujet :

C++Builder

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut Convertir un texte de 8 caractères en 4 octets BCD
    Bonjour,

    Dans un Tedit, je saisis un texte de 8 caractères.

    Je souhaite que ces 8 caractères soient repris dans 4 octets en tant que paires de caractères définissant 4 octets en hexadecimal. Les caractères saisis doivent donc etre compris entre 0 et F.

    Un exemple sera je pense la meilleure des explications :

    Je tapes "12345678" dans le Tedit
    je souhaite obtenir 4 octets (4 chars contenus dans un tableau par exemple) qui ont pour valeurs :
    0x12
    0x34
    0x56
    et 0x78

    "A12B143E" donnerait :
    0xA1
    0x2B
    0x14
    et 0x3E

    J'ai cherché dans les conversions de format mais je m'en sors pas

    Merci par avance
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  2. #2
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    voilà un bout de code pour convertir ta chaîne en ce que tu souhaites:
    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
     
         if(Edit2->Text != "")//Edit 2 contient la chaine en hexa
         {
    //conversion hexadecimale --> decimale
             std::string Hex = Edit2->Text.c_str();
             std::istringstream iss( Hex );
             iss >> std::hex >> x;
             Edit1->Text = IntToStr(x);//Edit1 contient la chaine en decéimale
     
    //conversion hexadecimale --> binaire
             std::bitset<24> b2( StrToInt(Edit1->Text) );
             std::ostringstream oss;
             oss << b2;
             std::string s2 = oss.str();  // s2 = "01001011"
             Edit3->Text = s2.c_str();//Edit3 contient la chaine en binaire
         }
         else
         {
             Edit1->Text = "";
             Edit3->Text = "";
         }
    En éspérant que cela puisse t'aider

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut petitours.
    Tu peu essayer ce bout de code.
    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
     
    // ne pas oublier d'inclure
    // #include "StrUtils.hpp"
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    String a;
    String b;
    String c;
     
    a = MidStr("123456", 1, 2);
    a = "0x" + a;
    b = MidStr("123456", 3, 2);
    b = "0x" + b;
    c = MidStr("123456", 5, 2);
    c = "0x" + c;
    }
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  4. #4
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut manquerait il qu'une conversion hexa->binaire ?
    Merci pour vos reponses

    je n'arrive pas à comprendre le fonctionnement de la proposition de bandit boy

    Pour celle de blondelle je comprend et j'arrive à faire fonctionner l'exemple
    mais je ne cherche pas à obtenir du texte "0x1a" je cherche à obtenir un octet de valeur 0x1a !

    Dans l'exemple "12345678" je souhaite obtenir un octet contenant 0x12, 0x34, 0x56 et 0x78 soit 18,52,86 et 120 en décimal !
    Je ne cherche pas à obtenir 4 textes contenant la representation hexa des valeurs.

    Le MidStr me fait approcher du but malgré tout, merci !
    Je me dis que HexToBin peut me sortir d'affaire mais j'obtiens toujours 1
    avec des essais pourtant simples
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char donnees[3] = "0a" ;
    char resultat[4] ;
     
    HexToBin(donnees,resultat,4);
     
    Label5->Caption = IntToStr(resultat) ;
    j'obtiens toujours 1...

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut petitours.
    Est ce que quelque chose comme cela t'irait.
    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
     
    // ne pas oublier d'inclure
    // #include "StrUtils.hpp"
    // #include "SysUtils.hpp"
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    String a;
    String b;
    String c;
     
    a = MidStr(123456, 1, 2);
    a = IntToHex(StrToInt(a),2);
     
    b = MidStr("123456", 3, 2);
    b = IntToHex(StrToInt(b),2);
     
    c = MidStr("123456", 5, 2);
    c = IntToHex(StrToInt(c),2);
    }
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  6. #6
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    non

    je me suis encore mal fait comprendre

    avec ce code, "123456" me donne 0C,22 et 38
    ces trois resultats sont lla conversion entier vers hexadecimal de 12,34 et 56.

    Moi c'est pratiquement l'inverse qu'il me faut.

    Le "123456" serait en fait une ecriture hexa de ce que je cherche ecrit sur 3 octets.
    le premier octet contient 0x12 (soit 18 en decimal)
    le second octet contient 0x34 (soit 52 en decimal)
    le troisieme octet contient 0x56 (soit 86 en decimal)
    "123456" est bien la visualisation hexa des 3 octets mis cote à cote

    il me faut trouver comment obtenir les valeurs 18,52 et 86 à partir du texte "123456"

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Quelque chose dans ce genre la (peut-être ?) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    union hextab{
    int n;
    Byte Bytes[4];
    };

    J'ai donc déclaré

    Et j'ai développé une méthode contenant le code suivant :

    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
    HexValues.n = 0;
    int j = 0;
    Byte c;
    AnsiString N = Edit1->Text; //l'objet test
    N = N.UpperCase(); //pour ne pas modifier l'objet test
    while((j < N.Length()) && (j < 8))
        {
        c = N[j + 1];
        if((c >= '0') && (c <= '9'))
            {
            c = (Byte)(c &0xF);
            }
        else
            {
            if((c >= 'A') && (c <= 'F'))
                {
                c = (Byte)(c - 'A' + 0xA);
                }
            else
                {
                ShowMessage("Caractère quantique !"); return;
                }
            }
        HexValues.n = (HexValues.n * 16) + c;
        j++;
        }
    A noter qu'au niveau de l'union, le LSB est en HexValues.Bytes[0].

    Ceci dit... il me semble qu'il y a peut-être plus simple... mais je ne m'en souviens plus...

    A plus !

  8. #8
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    bonjour et merci à tous

    je m'en suis sorti avec ce code
    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
    char __fastcall TForm1::ConversionAsciiToHex(unsigned char val1, unsigned char val2)
    {
      if (val1 > '9')
      {
        val1 -= 'A' ;
        val1 += 0x0A ;
      }
      else val1 -= '0' ;
      val1 <<= 4 ;  
     
      if (val2 > '9')
      {
        val2 -= 'A' ;
        val2 += 0x0A ;
      }
      else val2 -= '0' ;
     
      return (val1 + val2) ;
    }
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

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

Discussions similaires

  1. [MS-DOS] Une commande DOS pour convertir un texte en OEM
    Par Furius dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 30/12/2005, 19h47
  2. Réponses: 4
    Dernier message: 29/12/2005, 17h51
  3. convertir le text de DBedit vers PAnsiChar ?
    Par _alex_ dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2005, 14h44
  4. Convertir un texte en OEM avec Notepad++
    Par Furius dans le forum Autres Logiciels
    Réponses: 17
    Dernier message: 17/10/2005, 13h18
  5. Mode texte 80*50 caractères
    Par lorenfar dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/05/2005, 15h08

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