Показать сообщение отдельно
Старый 02.10.2009, 13:31   #1
Местный
 
Аватар для nezabudkin
 
Регистрация: 06.03.2008
Сообщений: 154
Сказал Спасибо: 46
Имеет 130 спасибок в 38 сообщенях
nezabudkin
По умолчанию Операции с массивами

Ребята, помогите, некак не могу разобраться. Скрипт относится к дешифрации пакетов. Нужно увеличить число длинной 4 байта, находящееся в массиве байтов, на определенную величину. В Delphi все просто:
delphi Код:
Inc(PLongWord(@Key[0])^,size);

А как это сделать в fastscript? Вот сам скрипт, проблема в процедуре DecryptPacket.

delphi Код:
var frm:Tform; memo:Tmemo; initmode: boolean; packet, stroka:string; key: array [0..7] of byte; KeyConst: array [0..7] of byte; procedure Init; //Вызывается при включении скрипта begin   frm := TForm.Create(nil);   frm.Caption := 'Chat';   frm.BorderStyle := bsSizeable;   frm.Position := poScreenCenter;   frm.align:=alBottom;   frm.Width:=700;   frm.Height:=200;   frm.FormStyle:=FsStayOnTop;   frm.Show;   memo :=TMemo.create(nil);   memo.parent:=frm;   memo.align:=alClient;   memo.WordWrap:=false;   memo.ScrollBars:=ssBoth;   initmode:= true;   packet:='';   stroka:='';   KeyConst[0]:= $84;   KeyConst[1]:= $73;   KeyConst[2]:= $66;   KeyConst[3]:= $E4;   KeyConst[4]:= $64;   KeyConst[5]:= $63;   KeyConst[6]:= $60;   KeyConst[7]:= $60; end; procedure Free; //Вызывается при выключении скрипта begin   memo.free;   frm.Free; end; function inttostrhex (number: byte) : string;  const   hexdigit = '0123456789ABCDEF';  var   i, d1, d2: integer;  begin   d1:=number shr 4;   d2:=number - (d1 shl 4);   result:= hexdigit[(d1 and $F)+1];   result:= result + hexdigit[(d2 and $F)+1];  end; function PackettoStr : string;  var   i, size: integer;   strochka: string;  begin   strochka:='';   size:=length(packet);   if size > 50 then size := 50;   for i:=1 to size do    begin     strochka:= strochka + inttostrhex(ord(packet[i])) + ' ';    end;   result:= strochka;  end; procedure KeyPacket;  var   i,n: byte;  begin   for i:=0 to 7 do    begin     key[i]:= ReadC(i+3) xor KeyConst[i];    end;  end; procedure DecryptPacket;  var   i, size: integer;  begin   size:=length(packet);   for i:=size downto 2 do                packet[i]:=chr(ord(packet[i]) xor Key[(i-1) and 7] xor ord(packet[i-1]));   if size<>0 then packet[1]:= chr(ord(packet[1]) xor Key[0]);   //ВОТ ТУТ ПРОБЛЕМА КАК ЭТО СДЕЛАТЬ?   //Inc(PLongWord(@Key[0])^,size);   // или   //IncasInteger(key, 0, size);  end; //основная часть скрипта //вызывается при приходе каждого пакета если скрипт включен begin  if pck = '' then exit;  if InitMode and FromServer then   begin    if pck[1] = #$2E then     begin      KeyPacket;      InitMode:= false;     end;    exit;    end;  if not InitMode and FromServer then   begin    packet:=pck;    DecryptPacket;    stroka:= PackettoStr;    memo.lines.add(stroka);   end; end.

Добавлено через 17 часов 6 минут
Тему АП!

Последний раз редактировалось nezabudkin, 02.10.2009 в 13:31. Причина: Добавлено сообщение
nezabudkin вне форума   Ответить с цитированием