Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Перевести из С++ в Delphi (https://forum.antichat.xyz/showthread.php?t=194720)

=Zeus= 08.04.2010 23:45

Перевести из С++ в Delphi
 
Помогите перевести следующие строки кода из С++ в Delphi. То есть у меня возникла проблема с типами данных и некоторыми функциями. Заранее спасибо.

Код:

void GetHashStr(wchar_t* Password,char *HashStr)
Код:

CryptHashData(hHash, (unsigned char*)Password, (wcslen(Password)+1)*2);
Код:

char TmpBuf[128];
Код:

wsprintf(TmpBuf,”%s%2.2X”, HashStr, c); // c это unsigned char

JnK 09.04.2010 00:17

Цитата:

Сообщение от =Zeus=
Помогите перевести следующие строки кода из С++ в Delphi. То есть у меня возникла проблема с типами данных и некоторыми функциями. Заранее спасибо.

Код:

void GetHashStr(wchar_t* Password,char *HashStr)
PHP код:

Procedure GetHashStr(Password:PWideCharHashStr:char

Код:

CryptHashData(hHash, (unsigned char*)Password, (wcslen(Password)+1)*2);
Это взял из своей функции:
PHP код:

var
  
Password:string;
...
CryptHashData(hHashPByte(Password), length(Password), 0

в Си варианте предлагают length(Password)*2
Код:

char TmpBuf[128];
PHP код:

var
  
TmpBuf:Char[0..128]; 

Код:

wsprintf(TmpBuf,”%s%2.2X”, HashStr, c); // c это unsigned char
Наверное так:
PHP код:

Format('%2.2x', [Ord(PChar(HashStr)[I])]); 

P.s. Как я понял это CryptApi.

=Zeus= 09.04.2010 00:42

Цитата:

Сообщение от JnK
P.s. Как я понял это CryptApi.

Да это из тех степей. Я перевожу функцию для дешифровки логина-пароля из Интернет Експлоера.
Если все получиться - выложу тут готовый вариант.

Password: PWideChar;
А далее ты пишешь
var Password: string;
Password берется из параметра первой процедуры. Все остальные функции вызываются в ней.

JnK 09.04.2010 00:43

Последнее дословно, наверное будет так:
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[i]);

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

slesh 09.04.2010 09:24

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)

=Zeus= 09.04.2010 17:35

JnK, slesh - спасибо, получилось! Ваши подсказки и метод научного втыка рулят.


Время: 13:05