Ik ben nog bezig met de GlobalPlatform.dll en om een AID te selecteren moet ik een array of byte doorgeven met de AID. De AID heb ik als AnsiString:
Hier blijf ik een beetje op hangen, ik heb de volgende functie gemaakt (de lengte van de array of Byte zet ik voor ik deze functie aanroep):
Delphi Code:
procedure StrToByteArray(Input: AnsiString; var Bytes: array of Byte; Literally: Boolean = false);
var
I, B : Integer;
begin
if Literally then
begin
for I := 0 to Length(Input) -1 do
if TryStrToInt('$' + Input[I +1], B) then
Bytes[I] := Byte(B)
else
Bytes[I] := Byte(0);
end else
Move(Input[1], Bytes[0], Length(Input));
end;
Als ik "Literally" gebruik krijg ik dus in de debugger op breakpoint te zien dat de AID array of Bytes er uit ziet als
Code:
(10, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0)
Maar als ik Move gebruik krijg ik
Code:
(65, 48, 48, 48, 48, 48, 48, 48, 48, 51, 48, 48, 48, 48, 48, 48)
Nu weet ik niet goed welke van de 2 nu juist is en welke niet.. Als ik namelijk online de string omzet naar bytes krijg ik nog een andere uitkom:
Code:
(41, 30, 30, 30, 30, 30, 30, 30, 30, 33, 30, 30, 30, 30, 30, 30)
Ik loop hier dus een beetje op vast - omdat de DLL de melding geeft dat de AID niet correct is, maar ik ben een beetje zoekend naar welke bytes ik nu eigenlijk moet doorgeven. Hieronder plaats ik ook even de functie die gebruikt wordt in de GPShell applicatie, waarmee ik dezelfde AID als string doorgeef wel success heb.
C++ Code:
static int convertStringToByteArray(TCHAR *src, int destLength, BYTE *dest)
{
TCHAR *dummy;
unsigned int temp, i = 0;
dummy = malloc(destLength*2*sizeof(TCHAR) + sizeof(TCHAR));
_tcsncpy(dummy, src, destLength*2+1);
dummy[destLength*2] = _T('\0');
while (_stscanf(&(dummy[i*2]), _T("%02x"), &temp) > 0)
{
dest[i] = (BYTE)temp;
i++;
}
free(dummy);
return i;
}
Bookmarks