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

Delphi Discussion :

conversion valeur hexadécimal


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    électronique, radioamateur, retraité, jardin
    Inscrit en
    Mars 2025
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : électronique, radioamateur, retraité, jardin
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2025
    Messages : 43
    Par défaut conversion valeur hexadécimal
    bonjour a tous ,
    attention je suis débutant sans expérience , ne vous offusquer pas par mes réponses
    logiciel Delphi 7

    sauriez vous me dire comment je peut retourné une valeur hexadécimal par poids
    exemple edit7.text' 0D8000' ; en edit8.text 00800D;
    voici le code que j'ai tenter d'utilisé mais je retourne mes valeur
    0D8000 en 0008D0 ?
    ai fait de nombreuse recherche sans succès, il est vrai que je ne sais pas trop dans quel direction chercher
    je fait donc appel a votre savoir
    cordialement



    voici ce que j'ai :
    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
    32
    33
    34
    35
    36
    //-------------------------------------------------------------------------------------pour la fonction je n'ai pas trouver juste une procédure 
    procedure ReverseBytes(Source, Dest: Pointer; Size: Integer);
    var
      BA: TByteArray;
      s: string;
    begin
    // Length(BA, 4);         // ici message d'erreur
    //  BA[0] := 65;          //
    //  BA[1] := $41;        //
    //  BA[2] := 1000001; // ceux la ne fonctionne pas
    // BA[0] := ord('A');   //
     
      s := ByteArrayToHexString(BA);                    // 41414141    //
      s := ByteArrayToHexString(BA ,' ');                // 41 41 41 41// je devrai les espacé mais cela ne marche pas et peut être pas besoin nom plus ?
      Dest := PByte( NativeUInt(Dest) + Size - 1); 
      while (Size > 0) do
      begin
        PByte(Dest)^ := PByte(Source)^;    //
        Inc(PByte(Source));                         // ici je retourne bien mais tout les chiffre et lettre hexadécimal 
        Dec(PByte(Dest));                           //   0D8000 en 0008D0 ? au lieu de """ 00 80 0d "" ou """ 00800D """
        Dec(Size);                                      //
      end;
    end;
    //--------------------------------------------------------------------------------------- ici un speedbutton de test
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var
      s: AnsiString;
      P: Pointer;
    begin
      s := #0 + edit7.Text;
      GetMem(P, Length(s));
      ReverseBytes(Pointer(s),P, Length(s));            // je pense qu'il me manque le contrôle des poids par 2 caractère 
     
      ShowMessage(PAnsiChar(p));   // esrevertset
      FreeMem(P);
    end;

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 64
    Par défaut
    salut regarde si ça te va j'avais ce code dans un tiroir j'ai juste changé les edit pour correspondre à ta demande
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      InputHex, OutputHex: string;
      i: Integer;
    begin
      InputHex := Edit7.Text;
     
      // Vérifie que la longueur est paire et multiple de 2
      if Length(InputHex) mod 2 <> 0 then
      begin
        ShowMessage('Entrée invalide : longueur impaire');
        Exit;
      end;
     
      OutputHex := '';
      // On lit les octets en partant de la fin
      i := Length(InputHex);
      while i > 0 do
      begin
        OutputHex := OutputHex + Copy(InputHex, i - 1, 2);
        Dec(i, 2);
      end;
     
      Edit8.Text := OutputHex;
    end;

  3. #3
    Membre actif
    Homme Profil pro
    électronique, radioamateur, retraité, jardin
    Inscrit en
    Mars 2025
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : électronique, radioamateur, retraité, jardin
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2025
    Messages : 43
    Par défaut conversion trie hexa
    bonsoir papyvore,
    houlala du grand art au premier coup ai copier dans un speddbutton ce code au premier coup dans le bonne ordre pile poile a ce que je voulai
    du coup je l'ai ajouté a mon code de convertion """" decimal to binaire to hexadecimal """""

    super content merci beau boulot
    sa marche avec un grand merci
    je vais notifier problème résolut






    ;12081547]salut regarde si ça te va j'avais ce code dans un tiroir j'ai juste changé les edit pour correspondre à ta demande
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      InputHex, OutputHex: string;
      i: Integer;
    begin
      InputHex := Edit7.Text;
     
      // Vérifie que la longueur est paire et multiple de 2
      if Length(InputHex) mod 2 <> 0 then
      begin
        ShowMessage('Entrée invalide : longueur impaire');
        Exit;
      end;
     
      OutputHex := '';
      // On lit les octets en partant de la fin
      i := Length(InputHex);
      while i > 0 do
      begin
        OutputHex := OutputHex + Copy(InputHex, i - 1, 2);
        Dec(i, 2);
      end;
     
      Edit8.Text := OutputHex;
    end;
    [/QUOTE]

  4. #4
    Invité
    Invité(e)
    Par défaut
    Certainement pour les petits microcontrôleurs cette affaire de big ou little endian n'a pas vraiment de sens tous les donnés sont converties d'une manière naturelle de premier vers le dernier octet, en Delphi il y a justement BinToHex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
     Value: integer;
     sOut: string;
    begin
      SetLength(sOut, 3*2);
      Value := $0D8000;
      BinToHex(@Value, @sOut[1], 3);
      Showmessage(sOut);
    end;
    Sinon tu peux copier la valeur entière dans un tableau d'octets et tu fais la conversion via IntToHex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     var
     I, Value: integer;
     sOut: string;
     Buff: array[0..3] of byte; // 4 octets la taile d'un entier
    begin
      Value := 432*2048;
      Move(Value, Buff,4);
      for I := 0 to 2 do // boucle sur 3 octets
      begin
        sOut := sOut + IntToHex(Buff[I],2);
      end;
      Showmessage(sOut);
    end;
    Dernière modification par Invité ; 07/05/2025 à 22h32.

  5. #5
    Membre actif
    Homme Profil pro
    électronique, radioamateur, retraité, jardin
    Inscrit en
    Mars 2025
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : électronique, radioamateur, retraité, jardin
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2025
    Messages : 43
    Par défaut conversion micro controleur
    bonjour rMist2024
    oui vous avez raison mais j'ai utilisé la conversion bintohex car j'ai tout d'abord convertie en binaire de faon a pouvoir ajouté 1 octet a la fin
    j'ai également ajouté une conversion avec virgule sa n'as pas été simple mai ouff j'ai enfin réussi
    car un décalage de 800 khz est trop importante
    il m'a fallu collé au plus prêt de la valeur a injecté dans mon microcontrôleur pour être sur la bonne fréquence d'utilisation
    actuellement je suis a environs 30 Hz de ma fréquence central ce qui est assez confortable sa fait un poil de grave en plus
    mais pas gênant en FM
    cordialement

  6. #6
    Membre émérite Avatar de sergio_is_back
    Homme Profil pro
    Consultant informatique industrielle, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique industrielle, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 187
    Par défaut
    J'ai vu passer ces discussions :

    Cela m'étonne que personne n'utilise des solutions plus simples.
    Par exemple l'ajout d'un bit à 1 à la fin d'une valeur ne consiste qu'à décaler les bits d'un entier vers la gauche d'une position et d'ajouter 1
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
         Entier32bits : Integer;
    begin
         Entier32bits:=12345;
         Entier32bits:=(Entier32bits shl 1)+1;
    end;
    L'opérateur SHL en Pascal décale les bits d'un entier (ou d'un Byte, ou d'un Word) de x octets vers la gauche
    L'opérateur SHR fait la même chose mais vers la droite

    En passant on remarque qu'à chaque décalage de 1 position vers la gauche on multiplie la valeur par 2

    1 shl 1 = 2 (0010 en binaire)
    2 shl 1 = 4 (0100 en binaire)
    4 shl 1 = 8 (1000 en binaire)

    etc...

    Ensuite la conversion en hexa est simple en utilisant la fonction Format si l'on ne souhaite ne prendre que les 3 octets de poids faible sur un entier 32 bits (qui comporte 4 octets)
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
        Str : string;
    begin
        Str:Format('%.06x',[Entier32bits]); // On converti en hexa sur 6 caractères en ajoutant les 0 non significatifs à gauche si nécessaire
    end;
    Enfin un entier 32 bits n'est qu'une suite de 4 octets en mémoire à une adresse accessible par son pointeur (l'opérateur @) :

    @Entier32bits : Donne l'adresse de l'octet de poids faible
    @Entier32bits + 1 c'est l'octet suivant
    etc...

    Sachant ceci, si l'on veut une chaine hexadécimale sur les trois premiers octets en les inversant :

    Avec Delphi, même si les pointeurs sont typés, il est possible de les "caster" et d'accéder à la valeur stockée à l'adresse du pointeur avec l'opérateur ^

    Démonstration :

    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
     
    program Project2;
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
      System.SysUtils;
    var
        Valeur  :   Cardinal;
        Adresse :   PByte;
    begin
        Valeur:=$01020304;
        Adresse:=@Valeur;    // Un pointeur de type Byte à l'adresse de et entier
        WriteLn(Format('Valeur en décimal = %d',[Valeur]));
        WriteLn(Format('Valeur en héxa = %.06x',[Valeur]));
        WriteLn(Format('Pointeur mémoire octet1 = %p',[Adresse]));
        WriteLn(Format('Octet 1 = %0.2x',[Adresse^]));  // Valeur de l'octet à l'adresse de départ
        WriteLn(Format('Octet 2 = %0.2x',[(Adresse+1)^])); // Valeur de l'octet à l'adresse de départ + 1
        WriteLn(Format('Octet 3 = %0.2x',[(Adresse+2)^]));
        WriteLn(Format('Octet 4 = %0.2x',[(Adresse+3)^]));
        WriteLn('Chaine hexadécimale en inversant l''ordre des octets = '+Format('%0.2x%0.2x%0.2x',[Adresse^,(Adresse+1)^,(Adresse+2)^]));
        ReadLn;
     
    end.
    Bon amusement avec les pointeurs !!

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

Discussions similaires

  1. Conversion valeur des mois en chaine de caractères
    Par babou466 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/03/2009, 09h12
  2. Erreur conversion valeur datetime à partir chaîne de caractères
    Par goullater dans le forum Développement
    Réponses: 1
    Dernier message: 16/04/2008, 14h55
  3. conversion valeur hexadecimal / adresse mémoire
    Par saturne13 dans le forum C
    Réponses: 10
    Dernier message: 04/02/2007, 20h15
  4. Réponses: 4
    Dernier message: 19/06/2006, 15h58

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