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 :

Convertir une valeur Puchar en string


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut Convertir une valeur Puchar en string
    Salut les developpeurs.

    J'ai entrain de developpez un programme qui lire un code depuis une carte sans contacte Le problème que la valeur recupérer est de type Puchar et je voudrais la convertir en string. Je n'ai pas trouvé cette fonction en delphi.

    Qelqu'un a une idee.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 361
    Points
    11 361
    Billets dans le blog
    6
    Par défaut
    c'est donc un pointeur sur chaîne AZT, équivalente à un PChar de Delphi.

    pour la conversion en string : MaChaine:=StringPas(MonPchar);

  3. #3
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut
    Merci pour votre aide

    J'ai utilisé cette fonction mais delphi n'a pas reconnu.

    Pour mieux expilque mon problème : j'ai trouvé une fonction en c++ qui converte un uchar (equivalent Puchar en delphi) vers cstring (string en delphi) et je n'arrive pas à tous le convertir car j'ai un peu de bagage en c++.
    et si quelqu'un pourrait m'aider à le convertir en delphi :

    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
     
     void UcharToStr(UCHAR *ucDataBuffer, ULONG ulDataBufLen, char *str)
       {
    	   ULONG j = 0;
    	   char bytetochar[3] ="";
    	   char Temp[1024] ="";
     
     
    	   for (j=0;j<ulDataBufLen;j++)
    	   {
    		   _itoa(ucDataBuffer[j],bytetochar,16);
    		   if (ucDataBuffer[j]<=0x0F)strcat(Temp,"0");
    		   strcat(Temp,bytetochar);
    	   }
     
    	   memcpy(str,Temp,ulDataBufLen*2);
    	   str[ulDataBufLen*2] = 0;
     
       }
    Merci d'avance

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 361
    Points
    11 361
    Billets dans le blog
    6
    Par défaut
    effectivement, la fonction est StrPas !

    dans le code C++, la fonction _itoa va convertir chaque octet du PUChar (array of Byte) en base 16 dans un string.

    Pour ton cas, la fonction à écrire en delphi peut ressembler à ça (non testé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function UCharToStr(PUChar: array of Byte; Longueur: Word): string;
    const
      Hexa: array[0..15] of Char = ('0','1','2,','3','4','5','6','7','8','9','A','B','C','D','E','F');
    var
      i: Word;
      o: Byte;
    begin
      for i:=0 to Longueur-1 
      do begin
        o:=PUChar[i];
        Result:=Result+Hexa(o and $F0);
        Result:=Result+Hexa(o and $0F);
      end;
    end;

  5. #5
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut
    Merci tourourou pour votre aide.

    J'ai fait un coup d'oil sur ta fonction et j'ai la corrigé. Mais j'ai essayer une modification en utilsant une variable de type (Puchar) au lieu de array of byte. Mais il me renvoi de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [DCC Erreur] Unkey.pas(205): E2016 Type tableau requis
    et voici le nouveau 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
     Function UCharToStr(PUChar: puchar; Longueur: Word): string;
    const
      Hexa: array[0..15] of Char = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
    var
      i: Word;
      o: Byte;
    begin
      for i:=0 to Longueur-1
      do begin
        o:=PUChar[i];
        Result:=Result+Hexa[o and $F0];
        Result:=Result+Hexa[o and $0F];
      end;
    end;

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Pour pouvoir répondre il faudrait qu'on sache comment vous avez déclaré puchar.

  7. #7
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Dasn l'unité Windows c'est un ^Byte

  8. #8
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    En regardant vite fait le code, je remarque également une chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function UCharToStr(PUChar: puchar; Longueur: Word): string;
    Ta variable PUChar est de type Puchar ... Il serait bon d'utiliser un autre nom pour ta variable ... du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function UCharToStr(VarPuChar: puchar; Longueur: Word): string;
    Aussi, pour l'erreur avec le tableau, c'est logique au vu de ta fonction ...
    tourlourou utilise un tableau, alors que toi non ...

    Je ne connais pas trop le principe de transformation ... je laisse donc place à d'autres pour la réponse.

    A+

  9. #9
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut
    Merci pour votre attention

    Je vais t'expliquer par detaille:

    J' ai un source include nommé scardcl.h en c++ qui fait appelle à des fonction stocker dans un dll.
    Voici un exemple de fonction stocker dans scardcl en c++:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    OKERR ENTRY SCardCLMifareStdRead(IN SCARDHANDLE ulHandleCard,
                                     IN ULONG       ulMifareBlockNr,
                                     IN OUT PUCHAR  pucMifareDataRead,
                                     IN ULONG       ulMifareDataReadBufLen,
                                     IN OUT PULONG  pulMifareNumOfDataRead);

    Cette source et utilisé dans un autre programme en c++ nommé ContactlessDemoVC.

    Voici la partie dans il fait appelle à la fonction SCardCLMifareStdRead.

    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
     
    void UcharToStr(UCHAR *ucDataBuffer, ULONG ulDataBufLen, char *str)
       {
    	   ULONG j = 0;
    	   char bytetochar[3] ="";
    	   char Temp[1024] ="";
     
     
    	   for (j=0;j<ulDataBufLen;j++)
    	   {
    		   _itoa(ucDataBuffer[j],bytetochar,16);
    		   if (ucDataBuffer[j]<=0x0F)strcat(Temp,"0");
    		   strcat(Temp,bytetochar);
    	   }
     
    	   memcpy(str,Temp,ulDataBufLen*2);
    	   str[ulDataBufLen*2] = 0;
     
       }
     void CContactlessDemoVCDlg::OnRead()
      {
     UCHAR  ucMifareDataRead[16] ={0};
    	   ULONG  ulMifareNumOfDataRead = 0;
    	   char str[80] = "";  
      lErr =SCardCLMifareStdRead(hCard,m_longBlockNr,ucMifareDataRead,16,&ulMifareNumOfDataRead);
     
     if (lErr == NO_ERROR)
    		   {
    			   UcharToStr(ucMifareDataRead,ulMifareNumOfDataRead,str);
     
    			   m_ctrOutput.AddString("Reading has been done successfully");
     
    }

    Voici une partie de scardcl.h conveter en delphi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function   SCardCLMifareStdRead( ulHandleCard :SCARDHANDLE ;
                                      ulMifareBlockNr :DWord       ;
                                     var pucMifareDataRead :PUCHAR    ;
                                      ulMifareDataReadBufLen: DWord     ;
                                     var pulMifareNumOfDataRead :PULONG  ): LongInt;stdcall;external scardcldll ;
    Et finalement dans mon programme je l'utilise comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    *******
     var ucMifareDataRead :Puchar;
    begin
     lErr := SCardCLMifareStdRead(FCardHandle,m_longBlockNr,ucMifareDataRead,16,ulMifareNumOfDataRead);
     
    .........
    ************
    Mon problème est le type du variable (pucMifareDataRead) et qui est en uchar en c++ et qui devient Puchar en delphi.

    J'espère que j'ai mieux expliqué.

    Merci d'avance

  10. #10
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 361
    Points
    11 361
    Billets dans le blog
    6
    Par défaut
    Linkin a raison : PUChar = PByte = ^Byte
    pour la fonction, voilà ce que c'est que de taper dans un forum plutôt que dans delphi...

    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
    function   SCardCLMifareStdRead( ulHandleCard :SCARDHANDLE ;
                                      ulMifareBlockNr :DWord       ;
                                     var pucMifareDataRead :array of Byte    ;
                                      ulMifareDataReadBufLen: DWord     ;
                                     var pulMifareNumOfDataRead :PULONG  ): LongInt;stdcall;external scardcldll ;
     
    function UCharToStr(PUChar: array of Byte; Longueur: Word): string;
    const
      Hexa: array[0..15] of Char = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
    var
      i: Word;
      o: Byte;
    begin
      for i:=0 to Longueur-1
      do begin
        o:=PUChar[i];
        Result:=Result+Hexa[o and $F0];
        Result:=Result+Hexa[o and $0F];
      end;
    end;
     
    var ucMifareDataRead :array of Byte;
    begin
      SetLength(ucMifareDataRead, 16);
      lErr := SCardCLMifareStdRead(FCardHandle,m_longBlockNr,ucMifareDataRead,16,ulMifareNumOfDataRead);
      if lErr=NoERROR then ShowMessage(UCharToStr(ucMifareDataRead, ulMifareNumOfDataRead^));
      SetLength(ucMifareDataRead, 0);
    ou garder le PByte dans la déclaration external et passer @ucMifareDataRead[0] ?

  11. #11
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut
    Merci à tourlourou et à tous pour votre aide

    Je vais essayer ce code

    à toute.

  12. #12
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut
    Merci à tous pour votre aide

    J'ai tester le nouveau code mais le problème c'est que la variable "pucMifareDataRead" de la fonction "SCardCLMifareStdRead" n'accepte pas le type "array of byte" donc le problème reste au niveau du dll "scardsyn.dll" lui même .

    Merci pour tous.

Discussions similaires

  1. Convertir la valeur d’une variable string en une variable.
    Par playitagainsam dans le forum Langages
    Réponses: 4
    Dernier message: 11/09/2012, 19h15
  2. forçage d'une valeur dans un string
    Par HRS dans le forum Langage
    Réponses: 3
    Dernier message: 03/08/2006, 15h56
  3. [TAG] Convertir une valeur numérique en hh:mm:ss
    Par Rafiki dans le forum Taglibs
    Réponses: 6
    Dernier message: 09/06/2006, 13h21
  4. Convertir une valeur d'une zone de texte en date
    Par os_rasta dans le forum ASP
    Réponses: 17
    Dernier message: 27/02/2006, 15h56
  5. Convertir une date en type string
    Par ziboux dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/10/2003, 10h52

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