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 :

Conversion hexa avec nombre de byte variables [Langage/Algorithme]


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par défaut Conversion hexa avec nombre de byte variables
    Bonjour,

    J'ai besoin d'une fonction qui me convertit une chaine représentant de l'hexa en un int.
    Je connais bien les fonctions de conversion classique StrToInt, StrToInt64, etc...
    Sauf que la valeur que je dois convertir a une taille qui varie de 1 à 8 byte et cela à son importance car si par exemple la taille est de 2, ma valeur héxa "E0C0" doit être convertit en -8000 et non en 57536.
    Par contre si la taille vaut 4, là oui je voudrai avoir la valeur 57536...
    Il me faudrait donc une fonction "StrTo" plus générique, qui convertisse en héxa mais à laquelle on puisse fournir la "taille" de la valeur en byte... Afin que les valeurs négatives soient converties correctement...
    J'espère que je suis claire, j'en suis pas très sûre !!!!
    merci pour votre aide !!

    Pascale38

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    IntToHex et StrToInt pour de la conversion numérique 32 Bits !

    HexToBin et BinToHex pour du Binaire Pur non signé

    Enfin, avec un petit peu de connaissance de l'architecture Little Endian du 686, la convertion par cast ou par affectation est très simple !

    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function StrToIntSigned16(const S: string): Smallint;
    begin
      Result := Smallint(StrToInt(S)); // cast pour bien comprendre, mais je ne le crois pas obligatoire !
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    short __fastcall StrToIntSigned16(const AnsiString S)
    {
      return (short)StrToInt(S); // le cast n'est même pas obligatoire, l'affectation est brute !
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      ShowMessage("0xE0C0 : " + IntToStr(StrToIntSigned16("0xE0C0")));
      ShowMessage("$E0C0 : " + IntToStr(StrToIntSigned16("$E0C0")));
     
      short IntSigned16 = StrToInt("0xE0C0");
      ShowMessage("E0C0 Direct : " + IntToStr(IntSigned16));
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par défaut
    merci pour ta réponse.

    Ce que je voudrais éviter c'est justement de devoir caster en "short" si la taille de la valeur à convertir est de 2, en int si elle est de 4 en int64 si elle est de 8, etc...
    Je voudrai savoir s'il n'est pas possible de faire ça de façon "générique".

    HexToBin ne m'intéresse pas vraiment car je veux une valeur décimale...
    A moins qu'il y ai un moyen simple ensuite de convertir ce binaire en décimal ??

    merci !
    Pascale38

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Citation Envoyé par Pascale38 Voir le message
    Ce que je voudrais éviter c'est justement de devoir caster en "short" si la taille de la valeur à convertir est de 2, en int si elle est de 4 en int64 si elle est de 8, etc...
    Tu ne peux pas dépasser 8 pour des nombres entiers gérés nativement en C++, après il faut passer à des lib comme l'équivalent du BigInteger du C# 4.0

    Si tu reste à 2, 4 et 8, tu utilises du Int64 systématiquement !
    Tu vérifies la taille de la chaine Hexa pour déterminer quel est le bit de poids fort avec BTS, tu retire ce bit (16eme ou 32eme), et tu le remplace au 64eme bit (avec complément binaire), ainsi tu conserve le signe sans avoir besoin de caster !

    Ou autre méthode, en fonction de la longueur tu choisi le cast !

    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
    //---------------------------------------------------------------------------
    __int64 __fastcall StrToSignedInt(const AnsiString S)
    {
      int L = S.Length();
      if (L >= 3)
      {
        if (S[1] == '0')
        {
          if (S[2] == 'x')
            L=-2;
        }
        else
        {
          if (S[1] == '$')
            L--;
        }
     
        switch (L)
        {
          case 2: return (char)StrToInt(S);
          case 4: return (short)StrToInt(S);
          case 8: return StrToInt(S);
          case 16: return StrToInt64(S);
        }
      }
      throw EConvertError(Sysconst_SInvalidInteger, OpenArray<TVarRec>(S), 0);
    }
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par défaut
    oui caster selon la taille c'est bon j'ai depuis le début ça !!

    Par contre là :
    Tu vérifies la taille de la chaine Hexa pour déterminer quel est le bit de poids fort avec BTS, tu retire ce bit (16eme ou 32eme), et tu le remplace au 64eme bit, ainsi tu conserve le signe sans avoir besoin de caster !

    heu c'est trop fort pour moi
    Comment je fais ça ??
    et BTS c'est quoi ???
    Bon enfin si tu as le temps hein, parce que bon moi ce que je voulais c'est faire un truc "propre" quoi mais bon c'est pas grave !
    merci en tout cas !!
    Pascale38

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par défaut
    Heu en fait le fait de "caster" ne réponds qu'à moitié à mon problème, vu qu'en fait la taille peut être aussi 3 ou 5 ou 6 ou 7, et dans ces cas là je n'ai pas de type pour caster !!
    Donc retour à la case départ...
    Donc peux tu m'éclairer sur la méthode dont tu parles là :
    Tu vérifies la taille de la chaine Hexa pour déterminer quel est le bit de poids fort avec BTS, tu retire ce bit (16eme ou 32eme), et tu le remplace au 64eme bit (avec complément binaire), ainsi tu conserve le signe sans avoir besoin de caster !
    merci d'avance !
    Pascale38

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

Discussions similaires

  1. Somme d'une colonne (avec nombre de rangée variable)
    Par Berny77 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/05/2008, 23h30
  2. Formulaire avec nombre de champ variable
    Par david87 dans le forum IHM
    Réponses: 0
    Dernier message: 21/04/2008, 10h16
  3. Requete paramétrée avec nombre de champs variable
    Par Braillane dans le forum Accès aux données
    Réponses: 3
    Dernier message: 07/02/2008, 23h09
  4. Un script shell avec nombre d'argument variable
    Par lastrecrue dans le forum Linux
    Réponses: 1
    Dernier message: 28/05/2006, 11h35
  5. méthodes avec nombres d'arguments variable
    Par spynux dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2006, 13h51

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