BG Development


  Closed TopicStart new topicStart Poll

> от Delphi пренаписване на PHP
radoslavbg
Публикувано на: 27-06-2011, 00:45
Quote Post



Име: Радослав
Група: Потребител
Ранг: Новопостъпил

Мнения: 1
Регистриран на: 27.06.11



Някой ще помогне ли да пренапишем този Delphi скрипт на PHP?!

Ето кода icon_smile.gif

CODE
unit uTCPCommon;
{Версия 3.0}

interface

uses Windows, scktcomp, Variants, SysUtils, DateUtils;

const
{!!!!!! *** ключовете са за XOR на стрингове ->
          не трябва да се получава #0 - край на стринг  *** !!!!!!}
  Key    : string[128] = 'A3v5%)g dgверСДГжфдСДФ4656dcfgfZ' +
                          #1#2#4#4#9#8#4#6#6#7#3#1#9#7#1#5  +
                         'FgАцЧшщшщ2ДaXdf,54w2Ass%6*9)*965' +
                          #3#5#4#6#9#8#4#9#6#7#5#1#9#3#2#4  +
                         'Dfс#дф#дг##@д2 Д3СДSd$$FVFseDF34';

           {не трябва да съдържа цифри, букви, интервали, запетаи...!!!}


  MaxPacketSize = 1024;
  PacketHeaderSize = 8;  {да е кратно на 8 (полетата в recodr-а в Delphi се разполагат на кратни ардеси)}
{RPacketHeader - index in array}
  I_PacketKind = 1;
  I_ID_Req     = 2;
  I_ID_Packet  = 3;
  I_CSum       = 4;
  I_DataLen_Lo = 5;
  I_DataLen_Hi = 6;
  I_Reserved1  = 7;
  I_Reserved2  = 8;

  MaxDataLen = MaxPacketsize - PacketHeaderSize;  {с хедъра да е до 1024}

  CheckAckTime  = 30;   {време между 2 проверки за получено потвърждение}
  CheckAckNum   = 12;   {брой неуспешни проверки за потвърждение, след които препредава}
  { време преди препредаване(ms) = CheckAckTime * CheckAckNum}

{!!! за сървъра TimeOut-а да е различен от този на клиента -           }
{ може да се получи наслагване на пакетите за потвърждение и първи пакет с данни !!!}
  SrvCheckAckTime  = 15;   {време между 2 проверки за получено потвърждение}
  SrvCheckAckNum   = 20;   {брой неуспешни проверки за потвърждение, след които препредава}
  { време преди препредаване(ms) = CheckAckTime * CheckAckNum}

  MaxRetryNum   = 60;   {максимален брой опити за препредаване на пакет}
  { време преди отказ от предаване(ms) = MaxRetryNum * CheckAckNum * CheckAckTime}


  FieldSeparator = #30; {разделител на полета}


type
  PPacket = ^RPacket;
  RPacketHeader = array [1..PacketHeaderSize] of byte;
  RPacketData = array [1..MaxDataLen] of byte;
  RPacket = record
     Header  : RPacketHeader;
     Data    : RPacketData;
  end; {RPacket}



function CalcCSum (const Pckt : RPacket) : byte;

function ReceivePacket (Socket: TCustomWinSocket;
                                 var Pckt : RPacket) : boolean;

function SendPacket (Socket: TCustomWinSocket;
                                 var Pckt : RPacket) : boolean;


function EncryptPacket (const S : string; var Pckt : RPacket) : boolean;

function DecryptPacket (const Pckt : RPacket; var S : string) : boolean;

function GetVar (const S : string; const VarType : char; var sp : integer; var ErrFlag : boolean) : variant;


implementation


function CalcCSum (const Pckt : RPacket) : byte;
var
  i : integer;
begin
  Result := Pckt.Header[I_PacketKind] xor
         Pckt.Header[I_ID_Req] xor
         Pckt.Header[I_ID_Packet] xor
         Pckt.Header[I_DataLen_Lo] xor
         Pckt.Header[I_DataLen_Hi] xor
         Pckt.Header[I_Reserved1] xor
         Pckt.Header[I_Reserved2];
  for i := (Pckt.Header[I_DataLen_Lo] +
                (256*Pckt.Header[I_DataLen_Hi])) downto 1 do
  begin
     Result := Result xor Pckt.Data[i];
  end;
end; {CalcCSum}




function SendPacket (Socket: TCustomWinSocket;
                                 var Pckt : RPacket) : boolean;
var
 PcktSize  : integer;  {размер на пакета - данни + служебни}
 i         : integer;
 SendSize  : integer;
begin
 Pckt.Header[I_CSum] := CalcCSum (Pckt);

 PcktSize := PacketHeaderSize + (Pckt.Header[I_DataLen_Lo] +
    (256*Pckt.Header[I_DataLen_Hi]));

 i := 10;
 repeat
    SendSize := Socket.SendBuf (Pckt, PcktSize);
    Result := (SendSize = PcktSize);
    if not Result then
    begin
       Sleep (0);
       Sleep (100);
       dec (i);
    end;
 until (Result) or (i <= 0);
end; {SendPacket}


function ReceivePacket (Socket: TCustomWinSocket;
                                 var Pckt : RPacket) : boolean;
var
 PcktSize : integer;  {размер на пакета - данни + служебни}
begin
 Result := false;
 PcktSize := Socket.ReceiveBuf (Pckt, SizeOf (Pckt));
 if PcktSize >= PacketHeaderSize then
 begin
    if (Chr(Pckt.Header[I_PacketKind]) >= '0') and
        (Chr(Pckt.Header[I_PacketKind]) <= '2') and
         ( (Pckt.Header[I_DataLen_Lo] +
    (256*Pckt.Header[I_DataLen_Hi])) = (PcktSize - PacketHeaderSize)) then
    begin
       if Pckt.Header[I_CSum] = CalcCSum (Pckt) then
          Result := true;
    end;
 end; {if PcktSize >= PacketHeaderSize then ...}
end; {ReceivePacket}



function EncryptPacket (const S : string; var Pckt : RPacket) : boolean;
var
  i : integer;
begin
  if Length (s) > MaxDataLen then
     Result := false
  else
  begin
     Pckt.Header[I_DataLen_Lo] := (Length(s)) mod 256;
     Pckt.Header[I_DataLen_Hi] := (Length(s)) div 256;
     for i := Length (s)downto 1 do
        Pckt.Data[i] :=  Ord(S[i]) xor Ord(Key[i mod Length(Key) + 1]);
     Result := true;
  end;
end;  {EncryptString}

function DecryptPacket (const Pckt : RPacket; var S : string) : boolean;
var
  i : integer;
begin
  SetLength (s, Pckt.Header[I_DataLen_Lo] + (256*Pckt.Header[I_DataLen_Hi]));
  for i := Length (s) downto 1 do
     s[i] := Chr ( Pckt.Data[i] xor Ord(Key[i mod Length(Key) + 1]));
  Result := true;
end; {DecryptString}


function EncryptRegString (const S : string) : string;
var
  i : integer;
begin
  SetLength (Result, Length(s));
  for i := 1 to Length (s) do
     Result[i] := Chr ( Ord(S[i]) xor Ord(Key[i mod Length(RegKey) + 1]));
end; {EncryptRegString}

function DecryptRegString (const S : string) : string;
var
  i : integer;
begin
  SetLength (Result, Length(s));
  for i := 1 to Length (s) do
     Result[i] := Chr ( Ord(S[i]) xor Ord(Key[i mod Length(RegKey) + 1]));
end; {DecryptRegString}


function GetVar (const S : string; const VarType : char; var sp : integer; var ErrFlag : boolean) : variant;
var
  VStr    : string;
  l       : integer;

  yy,mm,dd,hh,nn,ss,www : word; {за обработка на datetime}
begin
  Result := null;
  ErrFlag := false;

  if sp > Length (S) then
  begin
     ErrFlag := true;
  end;

  l := 0;
  while ( (s[sp+l]) <> FieldSeparator) and
          ((sp+l) < length(S) ) do
     inc (l);

  if (s[sp+l] <> FieldSeparator) then
  begin
     ErrFlag := true;
  end;

  try
     if l = 0 then
        Result := null
     else
     begin
        VStr := Copy(s, sp, l);
        Case VarType of
           'S' : Result := VStr;
           'I' : Result := StrToInt(VStr);
           'F' : Result := StrToFloat(VStr);
           'L' : if Trim(VStr) = '1' then
                    Result := true
                 else
                    Result := false;
           'D' : begin
                    yy := StrToInt (Copy(VStr,1,4));
                    mm := StrToInt (Copy(VStr,5,2));
                    dd := StrToInt (Copy(VStr,7,2));
                    hh := StrToInt (Copy(VStr,10,2));
                    nn := StrToInt (Copy(VStr,13,2));
                    ss := StrToInt (Copy(VStr,16,2));
                    www := StrToInt (Copy(VStr,19,3));
                    Result := EncodeDateTime( yy,mm,dd,hh,nn,ss,www);
                 end;
        end; {Case VarType of ...}
     end; {if l = 0 then ... else ...}
  except
     ErrFlag := true;
  end;

  sp := sp + l + 1;
end; {GetVar}

end.
PMEmail Poster
Top
DMforever
Публикувано на: 27-06-2011, 00:52
Quote Post



Име: Васил Богоев
Група: Потребител
Ранг: Старо куче

Мнения: 858
Регистриран на: 08.07.08



Браво, сега може всички IT форуми да наспамиш с тоя проблем... icon_lol.gif

За колегите дето не знаят -> http://bgproekti.net/projects/372/%D0%9F%D...0%BB%D0%B8_c__/

Човека soul се подвизава в нашия форум като radoslavbg и си мисли, че някой друг ще му свърши работата, която помеждодругото той сам е избрал да започне... icon_lol.gif

Това мнение е било редактирано от DMforever на 27-06-2011, 01:00


--------------------
Имаме пътища, имаме цели,
Но само в къщи сме силни и смели...

Васил Богоев - Social Network Developer

Демотиватори
PMEmail PosterUsers Website
Top
Elf-a
Публикувано на: 27-06-2011, 10:11
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1040
Регистриран на: 17.01.08



QUOTE (DMforever @ 27-06-2011, 00:52)
Браво, сега може всички IT форуми да наспамиш с тоя проблем... icon_lol.gif

За колегите дето не знаят -> http://bgproekti.net/projects/372/%D0%9F%D...0%BB%D0%B8_c__/

Човека soul се подвизава в нашия форум като radoslavbg и си мисли, че някой друг ще му свърши работата, която помеждодругото той сам е избрал да започне... icon_lol.gif

icon_lol.gif Добра детективска работа


--------------------
The Matrix is back !
Coming soon...
PMEmail Poster
Top
0xdeadc0de
Публикувано на: 27-06-2011, 10:18
Quote Post


Group Icon
Име:
Група: BG Dev модератори
Ранг: Почетен член

Мнения: 1987
Регистриран на: 26.07.04



Никой не може. Тук сме много прости всички.

Опитай в някой от тези форуми:
http://www.bg-mamma.com/?board=18.0
http://www.teenproblem.net/f/viewforum.php...a061956eceb5f3b


--------------------
One OS to rule them all, One OS to find them,
One OS to bring them all and in the darkness bind them ... MS-DOS FoReVeR!
PMEmail PosterYahoo
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Closed TopicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0