Results 1 to 5 of 5

Thread: String naar Array of Bytes

  1. #1

    String naar Array of Bytes

    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:
    Code:
    A000000003000000
    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:
    1. procedure StrToByteArray(Input: AnsiString; var Bytes: array of Byte; Literally: Boolean = false);
    2. var
    3.   I, B : Integer;
    4. begin
    5.   if Literally then
    6.   begin
    7.     for I := 0 to Length(Input) -1 do
    8.     if TryStrToInt('$' + Input[I +1], B) then
    9.       Bytes[I] := Byte(B)
    10.     else
    11.       Bytes[I] := Byte(0);
    12.   end else
    13.     Move(Input[1], Bytes[0], Length(Input));
    14. 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:
    1. static int convertStringToByteArray(TCHAR *src, int destLength, BYTE *dest)
    2. {
    3.     TCHAR *dummy;
    4.     unsigned int temp, i = 0;
    5.     dummy = malloc(destLength*2*sizeof(TCHAR) + sizeof(TCHAR));
    6.     _tcsncpy(dummy, src, destLength*2+1);
    7.     dummy[destLength*2] = _T('\0');
    8.     while (_stscanf(&(dummy[i*2]), _T("%02x"), &temp) > 0)
    9.     {
    10.         dest[i] = (BYTE)temp;
    11.         i++;
    12.     }
    13.     free(dummy);
    14.     return i;
    15. }

  2. #2
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    '0' is decimaal 48 en hexadecimaal 30
    '3' is decimaal 51 en hexadecimaal 33
    'A' is decimaal 65 en hexadecimaal 41


    de _T("%02x") lijkt een beetje op de stringformat routine waarbij de x een unsigned number hexadeciaal aangeeft

    x prints an unsigned number in hexadecimal.
    o prints an unsigned number in octal.
    u prints an unsigned number in decimal.
    d prints a signed number in decimal.
    i prints a signed number in decimal.


    afgaande op wat ik weet denk ik dat je deze code moet gebruiken
    (41, 30, 30, 30, 30, 30, 30, 30, 30, 33, 30, 30, 30, 30, 30, 30)

    gr.Peter
    Last edited by GolezTrol; 10-Apr-22 at 02:06.
    10.4.2, Delphi2010, of Lazarus 2.2.0

  3. #3
    Dankjewel voor mee te denken, met dan aan Remy Lebeau het antwoord gevonden. Ik zette elk karakter om van hex naar byte, maar in de originele c++ functie wordt dit per paar van 2 gedaan. Zo is de uiteindelijke array of bytes dus

    Code:
    A000000003000000 -> A0 00 00 00 03 00 00 00
    Wat dus een array met lengte van 8 bytes oplevert. Hier liep ik dus op vast omdat ik in de originele code had gezien dat de array of bytes gedeclareerd was op een lengte van 16 bytes.

  4. #4
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Maar dit is toch nog steeds geen array of bytes? A0 en 03 zijn nog steeds hex getallen
    Delphi is great. Lazarus is more powerfull

  5. #5
    Quote Originally Posted by jkuiper View Post
    Maar dit is toch nog steeds geen array of bytes? A0 en 03 zijn nog steeds hex getallen
    In die code van Remy is dat uiteraard wel een array of bytes (als je Literally op false laat staan). Alleen wordt ook een array of bytes vaak zo geschreven (hex met spaties ertussen). Een A0 en 03 kun je zo moeilijk als getal neerschrijven want dat kent een editor niet (je moet altijd een ascii representatie gebruiken).

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •