хз, тут у xkorа наверно понятней
http://coderx.ru/showpost.php?p=19192&postcount=12
delphi Код:
procedure AddChecksum(var data:array of char; position: Word);
var
i,k:Word;
begin
k := (position div 4)-1;
for i := 0 to k do
PCardinal(@data[position])^:=PCardinal(@data[position])^ xor PCardinal(@data[i*4])^;
end;
Добавлено через 2 часа 11 минут
Или вот из la2_client_emu
delphi Код:
procedure AddCheckSumm(var data: array of byte; len: integer);
type trec = record
t0: byte;
t1: byte;
t2: byte;
t3: byte;
end;
var chksum: Longword;
i: integer;
ecx: Longword;
t: trec;
begin
if length(data)<len+4 then exit;
chksum := 0;
i := 0;
while i < len do begin
t.t0 := data[i];
t.t1 := data[i + 1];
t.t2 := data[i + 2];
t.t3 := data[i + 3];
ecx := Longword(t);
chksum := chksum xor ecx;
i := i + 4;
end;
t := trec(chksum);
data[len]:=t.t0;
data[len+1]:=t.t1;
data[len+2]:=t.t2;
data[len+3]:=t.t3;
end;