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 d'un entier en char


Sujet :

Delphi

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 55
    Points
    55
    Par défaut Conversion d'un entier en char
    Bonjour,

    J'aimerais convertir un entier en char : de 132, j'aimerais obtenir #132 et non #$84 comme le fait le transtypage char(mon_entier)
    Merci de votre aide !

  2. #2
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Salut,

    J'aimerais convertir un entier en char : de 132 [...]
    Peut-être qu'en amont de cette réflexion existe la réponse.

    Suffit simplement d'ajouter un "signe" (#) en début de cet entier, non ?

    Enfin, si j'ai bien tout saisi.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 55
    Points
    55
    Par défaut
    C'est la que je demande comment ajouter le # devant ...

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    euh, chr (132) ne ferait il pas l'affaire ?

  5. #5
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Citation Envoyé par altaruk Voir le message
    C'est la que je demande comment ajouter le # devant ...
    Mon idée était de te demander de montrer ton code...

  6. #6
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Points : 55
    Points
    55
    Par défaut
    Chr(132) me renvoie #$84 ... OK
    Le problème est que j'envoie ca dans une trame via TComPort.
    J'utilise un analyseur de trame pour contrôler mon envoi :

    CAS 1 :
    envoi := #1 + #3 + #0 + '0' + #0 + #1 + #$84 + #5
    fPortSerie.WriteStr(envoi);

    J'observe ceci sur l'analyseur : 01 03 00 30 00 01 3F 05


    alors que si je fais :

    CAS 2 :
    envoi := #1 + #3 + #0 + '0' + #0 + #1 + #132 + #5
    fPortSerie.WriteStr(envoi);

    J'observe ceci sur l'analyseur : 01 03 00 30 00 01 84 05

    Bien sûr, la chaine "envoi" est obtenue dans une fonction de traitement.

    Bref, je suis dans le cas 1 et j'aimerais être dans le cas 2

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Il te suffit de convertir ton 132 en hexadécimal : IntToHex(132,2) -> 84

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 794
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 794
    Points : 13 465
    Points
    13 465
    Par défaut
    On dirait plutôt que ta gestion de chaîne s'enmêle les pinceaux et te renvoi un point d'interrogation ($3F) en remplacement d'un caractère inconnu .

  9. #9
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    On dirait plutôt que ta gestion de chaîne s'enmêle les pinceaux et te renvoi un point d'interrogation ($3F) en remplacement d'un caractère inconnu .
    +1

    #132 ou #$84 c'est exactement la même chose

    Autre chose, est-ce que ta communication est bien en 8 Bits par octet ? En format 7 bits les cractères envoyés sont limité de 0 à 127 Regarde comment tu as défini les paramètres de communication.

  10. #10
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    132 en octal -> Z decimal -> 90 hexa -> 0x5A

    132 en decimal -> ä hexa -> 0x84


    reste à savoir si ta trame doit être :

    SOH ETX NULL 0 NULL SOH Z ENQ
    ou
    SOH ETX NULL 0 NULL SOH ä ENQ

  11. #11
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Pour simplifier la tache il peut utiliser le fonction BinToHex

  12. #12
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 49
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par altaruk Voir le message
    Bonjour,

    J'aimerais convertir un entier en char : de 132, j'aimerais obtenir #132 et non #$84 comme le fait le transtypage char(mon_entier)
    Merci de votre aide !
    Si tu veux faire ce genre conversion c'est que tu pars d'une string. Donc avant de faire ta conversion tu ajoutes '0x' à ta string ou alors '$' ( les deux sont gérés par les routines de conversion de Delphi).
    Genre IntToStr('0x132') te donera 0x132 que tu pourras alors utiliser.

  13. #13
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par az0101 Voir le message
    Si tu veux faire ce genre conversion c'est que tu pars d'une string. Donc avant de faire ta conversion tu ajoutes '0x' à ta string ou alors '$' ( les deux sont gérés par les routines de conversion de Delphi).
    Genre IntToStr('0x132') te donera 0x132 que tu pourras alors utiliser.

    lol c'est pire ... 0x132 n'est même plus dans la table ascii ni même dans l'intervalle char ou byte.

    0x132 = 306.


    bon je pense qu'il ne faut pas faire un cours la dessus, mais juste rappeler vite fait que :

    byte = char
    donc
    132 = #132!

    paf.



    déjà il faudrait que notre ami nous si effectivement sa communication etait en 7 bits au lieu de 8!

    deuxio, savoir si il veut communiquer un "Z" ou un "ä" ... l'un comme l'autre ne sachant pas sur quoi il travail. on ne peut deviner.

    troisio, pour convertir un seul et unique byte ou char ... il n'est pas nécessaire d'utiliser BinToHex.
    surtout qu'ici, il n'est pas question de convertir quoique ce soit en hexa, mais d'arriver de 132 à #132 ... hum ... un vrai dilemme en somme ...

    un byte vers char (ansi) et inversement, une petite chaine vers bytes :

    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
    37
    38
    39
    40
    41
    42
    43
    44
     
    type
      TSingleBC = packed record case integer of
        0 : (C : AnsiChar);
        1 : (B : byte);
      end;
     
      TMultiBC = packed record case integer of
        0 : (Cs : array[byte] of AnsiChar);
        1 : (Bs : array[byte] of byte);
        2 : (Ws : array[0..$FF shr 1] of word);
        3 : (Ls : array[0..$FF shr 2] of LongWord);
      end;
     
    procedure TForm26.Button1Click(Sender: TObject);
    var
      SBC : TSingleBC;
      MBC : TMultiBC;
      N,M : byte;
    begin
      SBC.C := #132;
      ShowMessage(format('#132 = 0x%.2x = %d',[SBC.B, SBC.B]));
     
      SBC.B := 132;
      ShowMessage(SBC.C);
     
      FillChar(MBC.Cs, $FF, #0);
      for N := 32 to 126 do
        MBC.Bs[N-32] := N;
      ShowMessage(MBC.Cs);
     
      FillChar(MBC.Cs, $FF, #0);
      N := $30;
      M := 0;
      repeat
        MBC.Ls[M] := N or ((N+1) shl 8) or ((N+2) shl 16) or ((N+3) shl 24);
        inc(N, $04);
        inc(M);
      until N >= $80;
      ShowMessage(MBC.Cs);
     
      MBC.Cs := 'YOP!';
      ShowMessage(format('YOP! = %.2x %.2x %.2x %.2x',[MBC.Bs[0],MBC.Bs[1],MBC.Bs[2],MBC.Bs[3]]));
    end;

  14. #14
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 49
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    lol c'est pire ... 0x132 n'est même plus dans la table ascii ni même dans l'intervalle char ou byte.

    0x132 = 306.


    bon je pense qu'il ne faut pas faire un cours la dessus, mais juste rappeler vite fait que :

    byte = char
    donc
    132 = #132!

    paf.





    déjà il faudrait que notre ami nous si effectivement sa communication etait en 7 bits au lieu de 8!

    deuxio, savoir si il veut communiquer un "Z" ou un "ä" ... l'un comme l'autre ne sachant pas sur quoi il travail. on ne peut deviner.

    troisio, pour convertir un seul et unique byte ou char ... il n'est pas nécessaire d'utiliser BinToHex.
    surtout qu'ici, il n'est pas question de convertir quoique ce soit en hexa, mais d'arriver de 132 à #132 ... hum ... un vrai dilemme en somme ...

    un byte vers char (ansi) et inversement, une petite chaine vers bytes :

    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
    37
    38
    39
    40
    41
    42
    43
    44
     
    type
      TSingleBC = packed record case integer of
        0 : (C : AnsiChar);
        1 : (B : byte);
      end;
     
      TMultiBC = packed record case integer of
        0 : (Cs : array[byte] of AnsiChar);
        1 : (Bs : array[byte] of byte);
        2 : (Ws : array[0..$FF shr 1] of word);
        3 : (Ls : array[0..$FF shr 2] of LongWord);
      end;
     
    procedure TForm26.Button1Click(Sender: TObject);
    var
      SBC : TSingleBC;
      MBC : TMultiBC;
      N,M : byte;
    begin
      SBC.C := #132;
      ShowMessage(format('#132 = 0x%.2x = %d',[SBC.B, SBC.B]));
     
      SBC.B := 132;
      ShowMessage(SBC.C);
     
      FillChar(MBC.Cs, $FF, #0);
      for N := 32 to 126 do
        MBC.Bs[N-32] := N;
      ShowMessage(MBC.Cs);
     
      FillChar(MBC.Cs, $FF, #0);
      N := $30;
      M := 0;
      repeat
        MBC.Ls[M] := N or ((N+1) shl 8) or ((N+2) shl 16) or ((N+3) shl 24);
        inc(N, $04);
        inc(M);
      until N >= $80;
      ShowMessage(MBC.Cs);
     
      MBC.Cs := 'YOP!';
      ShowMessage(format('YOP! = %.2x %.2x %.2x %.2x',[MBC.Bs[0],MBC.Bs[1],MBC.Bs[2],MBC.Bs[3]]));
    end;
    Laisse tomber tu es trop dans ton truc technique. Le mec il a une string qui représente DEJA son char ( ou son byte...char étant un connerie de C, byte étant le terme réellement utilisé par les informaticiens ).

    Si tu relis bien le post, '132' ne peut pas être un entier c'est une string qui représente un entier. Donc si cet entier est déjà en Héxa, il faut rajouter '$' avant cette représentation afin de la convertir.

  15. #15
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    oui déjà la question n'etait pas claire en soit...

    puisque la valeur etant entre 0 et 255 on peut croire à avoir l'ordre d'un caractere dans la table ascii via la valeur entière.

    donc encore une fois, soit de savoir si on veux "Z", "ä" ou "132" (soit $31 $33 $32).
    et seul notre ami peut nous répondre ... quand il daignera se montrer.


    "Laisse tomber tu es trop dans ton truc technique"

    bah la programmation c'est forcement technique... si on veux un truc simple ... faut retourner aux légos... ou aux duplos si les légos c'est trop complexe
    de plus la méthode que je montre est beaucoup plus simple que n'importe quel autre méthode de conversion basé sur je ne sais quel truc mathématique.
    c'est juste la syntaxe qui parait complexe ...

  16. #16
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 49
    Points : 47
    Points
    47
    Par défaut
    C'est vrai, mon hypothèse c'était que la personne par exemple, essaye de passer d'un TEdit ayant pour Text '132' ( string ) vers le char 132.

    Dans ce cas Il aurait simplement à faire MyCharValue := Byte( StrToInt( '$'+MyTedit.Text )) pour obtenir son char.

    Bon ensuite n'ayant pas de nouvelles... ca me parait logique que c'est une string au départ, sinon la résolution du problème avait été donné quasiment dès le départ.

  17. #17
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Citation Envoyé par az0101 Voir le message
    Dans ce cas Il aurait simplement à faire MyCharValue := Byte( StrToInt( '$'+MyTedit.Text )) pour obtenir son char.
    Non, justement, il ne fallait pas le $ dans ce cas, car 132 suppose une base 10 et non une base 16.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyCharValue :=  Char( StrToInt( MyTedit.Text ))

Discussions similaires

  1. Conversion d'un entier en char*
    Par Langly dans le forum C++
    Réponses: 15
    Dernier message: 09/02/2006, 14h38
  2. Conversion d'un entier en caractères
    Par Tcheby dans le forum Langage
    Réponses: 6
    Dernier message: 18/11/2005, 08h41
  3. convertir tableau d'entier en char[]
    Par nin47 dans le forum C
    Réponses: 20
    Dernier message: 12/10/2005, 20h03
  4. conversion d'un entier en ASCII
    Par bischof dans le forum Langage
    Réponses: 6
    Dernier message: 08/07/2005, 13h18
  5. Conversion d'une chaine de char en numerique
    Par simone.51 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 25/03/2004, 16h47

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