Перевести из С++ в Delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by =Zeus=, 8 Apr 2010.

  1. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    Помогите перевести следующие строки кода из С++ в Delphi. То есть у меня возникла проблема с типами данных и некоторыми функциями. Заранее спасибо.

    Code:
    void GetHashStr([COLOR=Green]wchar_t*[/COLOR] Password,char *HashStr)
    Code:
    CryptHashData(hHash, [COLOR=Green](unsigned char*)[/COLOR]Password, ([COLOR=Green]wcslen[/COLOR](Password)+1)*2);
    Code:
    [COLOR=Green]char TmpBuf[128];[/COLOR]
    Code:
    [COLOR=Green]wsprintf(TmpBuf,”%s%2.2X”, HashStr, c);[/COLOR] // c это unsigned char
     
    #1 =Zeus=, 8 Apr 2010
    Last edited: 8 Apr 2010
  2. JnK

    JnK Elder - Старейшина

    Joined:
    30 Mar 2007
    Messages:
    125
    Likes Received:
    21
    Reputations:
    0
    Code:
    void GetHashStr([COLOR=Green]wchar_t*[/COLOR] Password,char *HashStr)
    PHP:
    Procedure GetHashStr(Password:PWideCharHashStr:char)
    Code:
    CryptHashData(hHash, [COLOR=Green](unsigned char*)[/COLOR]Password, ([COLOR=Green]wcslen[/COLOR](Password)+1)*2);
    Это взял из своей функции:
    PHP:
    var
      
    Password:string;
    ...
    CryptHashData(hHashPByte(Password), length(Password), 0
    в Си варианте предлагают length(Password)*2
    Code:
    [COLOR=Green]char TmpBuf[128];[/COLOR]
    PHP:
    var
      
    TmpBuf:Char[0..128];
    Code:
    [COLOR=Green]wsprintf(TmpBuf,”%s%2.2X”, HashStr, c);[/COLOR] // c это unsigned char
    Наверное так:
    PHP:
    Format('%2.2x', [Ord(PChar(HashStr)[I])]);
    P.s. Как я понял это CryptApi.
     
    #2 JnK, 9 Apr 2010
    Last edited: 9 Apr 2010
    2 people like this.
  3. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    Да это из тех степей. Я перевожу функцию для дешифровки логина-пароля из Интернет Експлоера.
    Если все получиться - выложу тут готовый вариант.

    Password: PWideChar;
    А далее ты пишешь
    var Password: string;
    Password берется из параметра первой процедуры. Все остальные функции вызываются в ней.
     
    #3 =Zeus=, 9 Apr 2010
    Last edited: 9 Apr 2010
  4. JnK

    JnK Elder - Старейшина

    Joined:
    30 Mar 2007
    Messages:
    125
    Likes Received:
    21
    Reputations:
    0
    Последнее дословно, наверное будет так:
    PHP:
     function wsprintfA(bufpcharformat:pcharparam:char):integercdecl;
     
    external user32 name 'wsprintfA';

    function 
    Jord(I:Char):String;
    var
      
    buf : array[0..255of char;
    begin
      wsprintfA
    (buf'%2.2x'i);
      
    result:=buf;
    end;
    применять просто в цикле:
    str:=str+Jord(TmpBuf);

    P.s. Спасибо SLESH дал в свое время мне эти функции :)
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    1) void GetHashStr(wchar_t* Password, char *HashStr) - это
    Procedure GetHashStr(Password:pWideChar; HashStr:pchar) // про * незабываем )

    2) CryptHashData(hHash, (unsigned char*)Password, (wcslen(Password)+1)*2);
    Тут считается кол-во символов расширенной строки + символ конца строки (0x00) и умножается на 2 чтобы узнать длинну в байтах. По этому более корректно будет так:
    CryptHashData(hHash, PByte(Password), (length(Password)+1)*2, 0)
     
    1 person likes this.
  6. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    JnK, slesh - спасибо, получилось! Ваши подсказки и метод научного втыка рулят.
     
    #6 =Zeus=, 9 Apr 2010
    Last edited: 9 Apr 2010