PDA

Просмотр полной версии : Как вычислить чексумму на дельфи?


stirena
05.10.2007, 18:13
Народ подскажите как вычислить чек сумму на дельфи, или помагите перевести функцию с с++



void add_ckecksum(unsigned char *raw, int count) {
unsigned long chksum = 0;
unsigned long ecx;
int i = 0;
for(i = 0; i < count; i += 4)
{
ecx = (unsigned long)raw[i];
ecx |= (unsigned long)raw[i + 1]<<8;
ecx |= (unsigned long)raw[i + 2]<<16;
ecx |= (unsigned long)raw[i + 3]<<24;
chksum ^= ecx;
}
memcpy(raw+count, (char *)&chksum, 4);
}
у меня вот как криво получилось


for i := 0 to ((Size-8) div 4)-1 do begin
ecx[0] := data1[i] xor data1[i+4] ;
ecx[1] := data1[i+1] xor data1[i+5] ;
ecx[2] := data1[i+2] xor data1[i+6] ;
ecx[3] := data1[i+3] xor data1[i+7] ;
end;

xkor
06.10.2007, 00:34
прошу:
procedure AddChecksum(var data:array of char; position: Word);
var
i:Word;
begin
for i := 0 to (position div 4)-1 do
PCardinal(@data[position])^:=PCardinal(@data[position])^ xor PCardinal(@data[i*4])^;
end;

используем так:
pck:=HexToString('26 00 02 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00');
AddChecksum(pck[3],Length(pck)-8-2);

тут pck это полный пакет от клиента логин серваре дешифрованный отправляемый в качестве запроса на вход на игровой сервер а Length(pck)-8-2 это позиция чексуммы относительно ID пакета (тоесть pck[3])
в результате примера в pck будет - 26 00 02 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 02 01 00 00 00 00 00 00

Добавлено спустя 5 часов 50 минут 33 секунды:
кстати то что ты представила как С++ код скорее всего не с++ а ява так как на яве нельзя манипулировать с памятью как хочется, а на С++ и этот код был бы намного короче)