Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.27;
Скачать: CL | DM;

Вниз

C php на Delphi   Найти похожие ветки 

 
HF-Trade ©   (2014-02-12 09:53) [0]

PHP -
function computeUnsignedCRC32($str){
  sscanf(crc32($str), "%u", $var);
  $var = dechex($var + 0);
  return $var;
};

function get_checksum($cs){
$var = computeUnsignedCRC32($cs);
$x = ("0x");
$a = substr($var, 0, 2);
$a = $x.$a;
$b = substr($var, 2, 2);
$b = $x.$b;
$c = substr($var, 4, 2);
$c = $x.$c;
$d = substr($var, 6, 2);
$d = $x.$d;
return chr($d).chr($c).chr($b).chr($a);
} ;

$head = chr(0x42).chr(0x45);
$pass = chr(0xFF).chr(0x00)."mypass";
$checksum = get_checksum($pass);
$loginmsg = $head.$checksum.$pass;
$_RCON = fsockopen("udp://"."localhost", 2302, $errno, $errstr, 1);
stream_set_timeout($_RCON, 1);
fwrite($_RCON, $loginmsg);

--------------------
*Embercadero RadStudio XE 15.0.3953.35171 2010
*Win 7 x64
То, что получилось -
*udp - TIdUDPClient
*xxxyyy - пароль

Ессесно не работает(

Function Crc32Str(const Text: String): Cardinal;
var
Byte, Mask, I: Cardinal;
begin
Result := Cardinal(-1);
For Byte in TEncoding.UTF8.GetBytes(Text) do
 Begin
  Result := Result xor Byte;
  For I := 7 downto 0 do
   Begin
    Mask := -(Result and 1);
    Result := (Result shr 1) xor (Mask and $EDB88320);
   End;
 End;
 Result := not Result;
end;

Function Get_Checksum(Str: String): String;
Var
 CRC: Integer;
 a,b,c,d: String;
Begin
 CRC := crc32Str(Str);
 Result := IntToHex(CRC,8);
 a := copy(Result, 1, 2);
 b := copy(Result, 3, 2);
 c := copy(Result, 5, 2);
 d := copy(Result, 7, 2);
 Result := chr(StrToInt("$"+d))+chr(StrToInt("$"+c))+chr(StrToInt("$"+b))+chr(StrToInt("$"+a));
End;

procedure TForm1.Button1Click(Sender: TObject);
Var
head, pass, checksum, loginmsg : String;
Begin

head := chr($42) + chr($45);
pass := chr($FF) + chr($00) + "xxxyyy";
checksum := get_checksum(pass);
loginmsg := head + checksum + pass;

Try
udp.Host := "localhost";
udp.BoundIP := "127.0.0.1";
udp.BoundPort := 2302;
udp.ReceiveTimeout := 2;
udp.Active := True;
udp.Connect;
IF udp.Connected  Then
 Begin
   udp.Send(loginmsg);
   Caption := "ok";
  End;
udp.Active := False;
Except
 MessageDlg("Error: ", mtError, [mbOk], 0);
End;
End;


 
Ega23 ©   (2014-02-12 10:55) [1]

Function Get_Checksum(Str: String): String;
Var
CRC: Integer;
a,b,c,d: String;
Begin
CRC := crc32Str(Str);
Result := IntToHex(CRC,8);
a := copy(Result, 1, 2);
b := copy(Result, 3, 2);
c := copy(Result, 5, 2);
d := copy(Result, 7, 2);
Result := chr(StrToInt("$"+d))+chr(StrToInt("$"+c))+chr(StrToInt("$"+b))+chr(StrToInt("$"+a));
End;


IntToHex?


 
HF-Trade ©   (2014-02-12 11:09) [2]

[1]
$var = dechex($var + 0);
dechex = IntToHex ?

Почему php выдает одно, а дельфи другое? -

delphi
test := chr($FF);
ShowMessage(IntToStr(crc32Str(test)));

php
$test = chr(0xFF);
sscanf(crc32($test), "%u", $var);
echo($var);

chr - в php и delphi одно и тоже??? или я туплю?


 
Ega23 ©   (2014-02-12 11:43) [3]

Chr + F1
И за юникод не забывай.


 
HF-Trade ©   (2014-02-12 18:56) [4]

В [0]
заменил
For Byte in TEncoding.UTF8.GetBytes(Text) do
на
For Byte in TEncoding(1252).GetBytes(Text) do

Добавил

function enc(buf: string): string;
var
B: TBytes;
begin
B := TEncoding.GetEncoding(1252).GetBytes(buf);
result:=StringOf(B);
end;

loginmsg := enc(loginmsg);

Почему 135 символ - "‡" отображается как "?"

То что приходит с php
BE‡НYZяNULpass

То что приходит с delphi
BE?НYZяNULpass

Вообще с кодировками не понимаю...


 
HF-Trade ©   (2014-02-13 15:21) [5]

Вощем, дело было с индюшным udp......
Не работает тварина. Хотя мб там и с сокетами такая же фигня, мб криво установилась RAD XE
Хорошо, стояла D7. Там все на ура.


 
Ega23 ©   (2014-02-13 15:50) [6]

Ещё раз: обрати внимание на то, что в Delphi теперь string - это юникод. И Char - это тоже юникод.

Запусти простой пример:

procedure TForm11.Button2Click(Sender: TObject);
begin
 ShowMessage(IntToStr(Ord(Char("я"))));
 ShowMessage(IntToStr(Ord(AnsiChar("я"))));
end;


 
HF-Trade ©   (2014-05-08 02:32) [7]

Ega23 спс.

Заменил все на AnsiString и AnsiChar

Все верно.

Если отправляю так -

UDP.Send(RCon_Send(#$00, "password"));

Нифига не работает(я правильно понял, что если я передам ansiString в String, то автоматом будет юникод?)

Переписал так -

Function RCon_Send(cmdBytes, data: AnsiString): TBytes;
Var
cmd, CheckSum : AnsiString;
I             : Integer;
Begin
cmd      := #$FF + cmdBytes + data;
CheckSum := RCon_CheckSum(cmd);
cmd      := Head + CheckSum + cmd;
SetLength(Result, Length(cmd));
For I := 1 to Length(cmd) do
 Result[I - 1] := ORD(cmd[I]);
end;

Отправляю так:
UDP.SendBuffer(RCon_Send(#$00, "password"));

Все ок.

Пытаюсь получить ответ:

sText := UDP.ReceiveString(1000);

Приходит чушь.

Как получить теперь? - как то так?

UDP.ReceiveBuffer(B, SizeOf(B));



Страницы: 1 вся ветка

Текущий архив: 2015.09.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.004 c
15-1423776652
Юрий
2015-02-13 00:30
2015.09.27
С днем рождения ! 13 февраля 2015 пятница


15-1423431005
Юрий
2015-02-09 00:30
2015.09.27
С днем рождения ! 9 февраля 2015 понедельник


15-1422336953
ANTPro_
2015-01-27 08:35
2015.09.27
Ускорить экспорт в Excel


2-1396972116
Andrey5
2014-04-08 19:48
2015.09.27
Базы данных в делфи


2-1392184427
HF-Trade
2014-02-12 09:53
2015.09.27
C php на Delphi