Форум: "Начинающим";
Текущий архив: 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