Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2015.09.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.002 c
15-1423303455
Kerk
2015-02-07 13:04
2015.09.27
О ТЗ


15-1423564709
Andy BitOff
2015-02-10 13:38
2015.09.27
js для DM


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


15-1423603829
Юрий
2015-02-11 00:30
2015.09.27
С днем рождения ! 11 февраля 2015 среда


15-1423690240
Юрий
2015-02-12 00:30
2015.09.27
С днем рождения ! 12 февраля 2015 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский