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

VB.NET Discussion :

donner comme valeur un pointeur à un index de tableau


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Points : 48
    Points
    48
    Par défaut donner comme valeur un pointeur à un index de tableau
    Bonsoir,

    J'essaie de transformer cette fonction en C dans laquelle le tableau contenant la commande envoyé à une API a son dernier index pointant sur un pointeur, si je comprend bien la longueur ATR contenu dans cmd[4] est calculé à posteriori à partir de la réponse, mais je vois pas comment faire cela en vb.net

    Code C : 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
    unsigned char  cmd[5];
    	unsigned char  rsp[252];
    	unsigned short rspLen;
     
    	/* Build command */
    	cmd[0] = 0x80;
    	cmd[1] = 0x36;
    	cmd[2] = 0x00;
    	cmd[3] = 0x00;
    	cmd[4] = *atrLength;
     
    	/* Send command  */
    	rspLen = sizeof(rsp);	
    	deviceLastError = sSmartISOEx( cscHandle, samSlot, 5, cmd, &rspLen, rsp );
     
    	*atrLength = (unsigned char)rspLen - 2;

    Le prototype de la fonction comme il est spécifié
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    short   sSmartISOEx                 (CSC_HANDLE apiHandle,
                                         eDestReaderType xDestReaderType,
                                         USHORT usInDataLen,
                                         const UCHAR *pucDataIn,
                                         USHORT *pusOutDataLen,
                                         UCHAR *pucDataOut);

    Pour le moment ma commande qui fonctionne ressemble à ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          Dim command(4) As Byte
    	command(0) = 128
    	command(1) = 54
    	command(2) = 0
    	command(3) = 0
    	command(4) = 255 ' 255 pour prévoir le max possible de la réponse
    	Dim rsp(255) As Byte ' 255 pour prévoir le max possible de la réponse
    	'Dim rspLen As New uint16 = 255
    	ApiReturn = sSmartISOEx(cscHandle, samSlot,5,cmd(0), rspLen,rsp(0))

    Merci par avance pour les pistes, car là je vois pas du tout comment faire.

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ....contenant la commande envoyé à une API a son dernier index pointant sur un pointeur,
    Erroné....
    le code c posté...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmd[4] = *atrLength;
    signifie que cmd[4] "pointe" ou contient la valeur du pointeur atrLength...

    Ton code c lui est incomplet ou tronqué il ne mentionne nulle part la déclaration du pointeur atrLength,ni le type de donnée sur laquelle il pointe ni sa valeur initiale ...

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Points : 48
    Points
    48
    Par défaut
    Bonsoir merci pour ton retour, en effet j'ai voulu simplifier le code pour ma question

    En fait le code en C correspond à une fonction d'API codé par quelqu'un d'autres, je cherche à transposer cette fonction en VB.net, mais je seche un peu dés qu'il y a des pointeurs.

    Code C : 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
    int SamGetAtr( u32 readerIndex, unsigned char *atr, unsigned char* atrLength, int slot, int reset, int mode)
    {
    	unsigned char  cmd[5];
    	unsigned char  rsp[252];
    	unsigned short rspLen;
     
    	u32 samReaderIdx = g_ReaderContext[readerIndex].samReaderIndex;
     
    	/* Build command */
    	cmd[0] = 0x80;
    	cmd[1] = 0x36;
    	cmd[2] = 0x00;
    	cmd[3] = 0x00;
    	cmd[4] = *atrLength;
     
    	/* Send command and get response */
    	rspLen = sizeof(rsp);	
    	TRACEBUF_DEBUG(cmd, 5);
    	g_ReaderContext[readerIndex].deviceLastError = sSmartISOEx( g_ReaderContext[samReaderIdx].cscHandle, g_ReaderContext[readerIndex].samSlot, 5, cmd, &rspLen, rsp );
    	TRACEBUF_DEBUG(rsp, rspLen);
    	TRACE_DEBUG("err = %d", g_ReaderContext[readerIndex].deviceLastError);
    	if ( g_ReaderContext[readerIndex].deviceLastError != ERR_NONE )
    		return ERROR_PCD;
     
    	/* OK */
    	*atrLength = (unsigned char)rspLen - 2;
    	memcpy( atr, rsp, *atrLength );
    	return ERROR_NONE;
     
    	(void)slot;
    	(void)reset;
    	(void)mode;
    }

    Du coup j'ai modifié ma fonction comme ceci, mais je dois faire un peu n'importe quoi sur les "Convert.To" car j'ai un wanring " conversion implicite de uinteger en integer" pour la ligne "Buffer.BlockCopy(reponse,0,atr,0,Convert.ToUInt32(atrLen +1))" et obliger de commenter "Explicit on" dans mon code
    Tout comme les -2 et +1, je dois certainement me compliquer la vie, mais ca a l'air de fonctionner

    En fait je comprend mieux ce que la personne a fait, AtrLen n'est pas connu au départ donc on lui assigne la valeur max possible '255', puis c'est l'appel à l'APIet la fonction "sSmartISOEx" qui retourne la longueur AtrLen correct


    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
    	Dim atrLen As Byte
    	atrLen = 255
    	Dim command(4) As Byte
    	Dim reponse(254) As Byte  'rsp avec MAX_ISO_DATA_OUT_LENGTH
    	Dim reponseLen As UInt16
    	Dim atr() As byte
    	reponseLen = Convert.ToUInt16(reponse.Length)  'rspLen
    	command(0) = 128
    	command(1) = 54
    	command(2) = 0
    	command(3) = 0
    	command(4) = atrLen
    	ApiReturn = sSmartISOEx(Me.CscReaderHandle, ReaderType,5,command(0), reponseLen, reponse(0))
    	If ApiReturn <> 0 Then
    		DisplayError(ApiReturn) 
    	Else
    		atrLen = Convert.ToByte(reponseLen - 2)
    		ReDim atr(atrLen)
    		'Buffer.BlockCopy(reponse,0,atr,0,19)
    		Buffer.BlockCopy(reponse,0,atr,0,Convert.ToUInt32(atrLen +1))
    	End If

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Points : 48
    Points
    48
    Par défaut
    Voila , j'ai revu toute ma fonction , ca m'a l'air plus propre, par contre j'ai toujours un warning sur conversion implicite de Integer en ushort pour la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    realatrLen = reponseLen - 2
    mais je vois pas comment faire pour supprimer ce warning

    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
    Dim atr(0) As byte ' variable contenant l'ATR à la fin du traitement
    	Dim virtualatrLen As Byte = &H00 'Valeur par défaut de la longueur de l'ATR avant traitement
    	Dim realatrLen As UInt16
    	Dim reponse(255) As Byte  'rsp avec MAX_ISO_DATA_OUT_LENGTH
    	Dim reponseLen As UInt16 = Convert.ToUInt16(reponse.Length) 'nb d'octets necessaire pour stocker la réponse
    	'command APDU "Get SAM ATR" sur 5 octets
    	Dim command() As Byte = {&H80, &H36, &H00, &H00, virtualatrLen}
    	ApiReturn = sSmartISOEx(Me.CscReaderHandle, ReaderType,5,command(0), reponseLen, reponse(0))
    	If ApiReturn <> 0 Then
    		DisplayError(ApiReturn) 
    	Else
    		realatrLen = reponseLen - 2 'Longueur de la réponse de l'API - les 2 octets de status SW1 - SW2 : 90 00(OK)
    		Array.Resize(atr,realatrLen) 'redimensionnement du tableau contenant l'ATR final 
    		Buffer.BlockCopy(reponse,0,atr,0,realatrLen)
    	End If

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Voici une facon de manipuler des "pointeurs" en vb.net à l'aide de :

    -GCHandle : il fournit un "handle" du systeme ( pointeur système de type int32) "pinné" (c.à.d fixe en mémoire non-manage ou non collectable par le GC)...

    -IntPtr pointeur manage(de type int32)...

    L'adresse du "handle" systeme est affecteé IntPpr...

    Pour lire la valeur du pointeur manage on utilise les fonctions statiques du "general Marshall" suivant le type(byte,int32,single etc...):
    -Marshal.ReadByte(tonIntPtr,offsetInt) ce qui permet de lire la valeur d'un type simple ou un tableau...
    Equivalent C :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n  =0;
    int n  = *ptrInt,
    Pour affecter une valeur au pointeur manage on utilise les fonctions statiques du "general Marshall" suivant le type(byte,int32,single etc...) équivalentes pour la lecture :
    -Marshal.WriteByte(tonIntPtr,offsetInt) ce qui permet d’écrire la valeur d'un type simple ou un tableau...
    Equivalent C :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int n  =10;
     *ptrInt=n;

    code exemple .vb;

    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
    45
    46
    47
    48
    49
    50
    Imports System.Runtime.InteropServices
    Imports System.Text
     
    Public Class Form1
        Private sb As New StringBuilder
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim LenBuffer As Byte = 255
            Dim Buffer(LenBuffer - 1) As Byte
            sb.Clear()
            sb.AppendLine("original buffer of bytes:")
            For i As Integer = 0 To Buffer.Length - 1
                Buffer(i) = i + 1
                sb.AppendLine(Buffer(i).ToString)
            Next
     
     
            Dim BufferRes(LenBuffer - 1) As Integer
     
            Dim Handle As GCHandle = GCHandle.Alloc(Buffer, GCHandleType.Pinned)
            Dim ptrbuff As IntPtr = Handle.AddrOfPinnedObject.ToInt32
            Dim HandleLenBuffer As GCHandle = GCHandle.Alloc(LenBuffer, GCHandleType.Pinned)
            Dim ptrLen As IntPtr = HandleLenBuffer.AddrOfPinnedObject.ToInt32
     
     
            BufferRes = WritetoBuffer(ptrbuff, ptrLen)
            Handle.Free() 'la liberation des GCHandle est obligatoire
            HandleLenBuffer.Free()
     
            sb.AppendLine()
            sb.AppendLine("BufferRes of integer:")
            For i As Integer = 0 To BufferRes.Length - 1
                sb.AppendLine(BufferRes(i).ToString)
            Next
            TextBox1.Text = sb.ToString
        End Sub
     
        Public Function WritetoBuffer(ptr As IntPtr, data As IntPtr) As Integer()
            Dim N As Byte = Marshal.ReadByte(data, 0)
            Dim arr(N - 1) As Integer
     
            For i As Integer = 0 To N - 1
                Dim b As Byte = Marshal.ReadByte(ptr, i)
     
                arr(i) = b * 100
            Next
            Return arr
        End Function
     
     
    End Class
    bon code...

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Points : 48
    Points
    48
    Par défaut
    Merci pour la réponse, je vais regardé tout ca a tête reposé.

    Merci encore.

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

Discussions similaires

  1. Possibilité de donner comme valeur de dictionnaire, un numpy ?
    Par Ben20 dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 23/06/2015, 12h07
  2. donner la valeur d'une variable comme nom de table
    Par cladsam dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/10/2005, 15h16
  3. [Custom Tags 1.2] Passer une variable comme valeur d'attribut d'un tag jsp
    Par Pi2 dans le forum Taglibs
    Réponses: 7
    Dernier message: 16/09/2005, 14h44
  4. Réponses: 2
    Dernier message: 07/07/2005, 18h11
  5. Echange de valeurs par pointeur et réf
    Par smag dans le forum C++
    Réponses: 6
    Dernier message: 01/03/2005, 18h39

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