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

Langage Delphi Discussion :

transcoder des codes ascii en caractères


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 29
    Points
    29
    Par défaut transcoder des codes ascii en caractères
    Salut !
    Je voudrais savoir comment on fait pour convertir un fichier texte qui contient des codes de touches clavier :

    exemple de ce que le fichier contient :

    53414C5554

    ce qui correspont à : salut
    53 -> s
    41 -> a
    etc

    en un autre fichier texe qui contient les fameux caractères ...

    j'ai fait un truc qui ressemble à ça :

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var  F1, F2: TextFile;
      Ch: Byte;
    begin
    if OpenDialog1.Execute then begin
        AssignFile(F1, OpenDialog1.Filename);
        Reset(F1);
        if SaveDialog1.Execute then begin
          AssignFile(F2, SaveDialog1.Filename);
          Rewrite(F2);
          while not Eof(F1) do
          begin
            Read(F1, Ch);
            Write(F2, Ch);
          end;
          CloseFile(F2);
        end;
        CloseFile(F1);
      end;
    end;
    seulement ( et je comprends pourquoi) ça me copie la même chose
    Pourriez vous me dire ce qu'il faut modifier pour faire ce que je veux ...

    Merci de votre aide ...

    Gilles

  2. #2
    Membre habitué Avatar de Archibald29
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 112
    Points : 131
    Points
    131
    Par défaut Code Ascii
    Salut,

    Tu peux sans doute utiliser la fonction Chr :

    Chr renvoie le caractère correspondant à une valeur ASCII.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function Chr(X: Byte): Char;
    Description
    La fonction Chr renvoie le caractère dont l'ordre (sa valeur ASCII) est égal à l'expression X de type octet.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    begin
      Canvas.TextOut(10, 10, Chr(65));  { la lettre 'A'}
    end;
    Il te faudra transmettre à la fonction 2 Character à chaque appel pour que la conversion s'effectue correctement, donc :

    -> Lire deux caractéres de suite dans F1
    -> Les regrouper dans une chaine par exemple
    -> transmettre cette chaine à Chr pour conversion
    -> Ecrire le caractère obtenu dans F2

    La fonction qui fait le travail inverse est 'Ord' qui renvoie par exemple '65' lorsqu'on lui transmet 'A'.


    [Balises CODE rajoutées par Pedro. Merci d'y penser à l'avenir]

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 29
    Points
    29
    Par défaut
    Salut !

    j'ai modifié en ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          while not Eof(F1) do
          begin
            Read(F1, Ch1);
            Read ( F1, Ch2);
            s := Ch1 + Ch2;   // Ch1 et Ch2 : Char;
            x := chr(strtoint(s));      // x et s : string;
            Write(F2, x);
          end;
    mais ça ne marche toujours pas ...

    ça met pas les bons caractères ...

    le 41 qui devrait être converti en : a est converti en )
    le 42 en * au lieu de b

    etc ...
    je suis pas loin ... je pense mais je trouve po ... !!!

    [Modération]
    Merci d'utiliser les balises code ou quote,Laurent Dardenne
    [/Modération]

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    C'est parce que 41 est codé en hexa : 4 x16 +1 =65.

    ceci devrait convenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x:=chr(ord(HexToBin(@Text,@s[1],2)) ;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    C'est normal

    41 est le code ascii de 'A' mais en héxadécimal

    or, lorsque tu fais StrToInt( '41' ), cela te renvoie, le nombre 41... qui est bien le code Ascii de '('.

    Autrement dit, tu dois convertir ta chaine qui représente un héxa en entier

    Aide toi de la fonction

    HexToBin(...)

    A++
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Oups,

    mon codage est erroné, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i:=HexToBin(@x,@s[1],2) ; if i<>2 then showmessage('erreur) ;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 29
    Points
    29
    Par défaut
    salut ...

    Désolé, je débute un peu en Delphi ... (on va dire )
    et je ne comprend pas trop ce qu'il faut faire ....

    quelqu'un peut m'écrire les 3 ou 4 lignes qu'il doit y avoir entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while not Eof(F1) do
          begin
     
     
     
          end;
          CloseFile(F2);
    avec les variable utilisées et en quoi elles doivent être déclarée ...
    merci de votre aide ...
    [Balises CODE rajoutées par Pedro. Merci d'y penser à l'avenir]

Discussions similaires

  1. Comment écrire un shell qui transforme un code ascii en caractère?
    Par jack-ft dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 21/04/2008, 17h51
  2. Comment associer le code ASCII aux caractères
    Par y.medium dans le forum C
    Réponses: 18
    Dernier message: 18/11/2007, 16h20
  3. Transformer le code ascii en caractère
    Par Death83 dans le forum C++
    Réponses: 4
    Dernier message: 28/11/2006, 17h10
  4. Convertir des codes ASCII en lettres
    Par grigri dans le forum Pascal
    Réponses: 4
    Dernier message: 14/04/2006, 11h54
  5. chaîne à partir des codes ascii
    Par parsy dans le forum Langage
    Réponses: 2
    Dernier message: 05/08/2005, 22h19

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