Hi
Zitat von
Sebastian R.:
Code:
int csum(const void *bufv, int length)
{
const unsigned short *buf = (const unsigned short *)bufv;
unsigned long result = 0;
while (length > 1) {
result += *(buf++);
length -= sizeof(*buf);
}
if (length) result += *(unsigned char*)buf;
result = (result >> 16) + (result & 0xFFFF);
result += (result >> 16);
result = (~result)&0xFFFF;
return (int)result;
}
Kompiliert, probiert hab ichs aber nicht. Sollte jedoch so ziemlich das selbe sein:
Delphi-Quellcode:
function csum(
const bufv: Pointer; length: integer): integer;
var
res, bufIndex: cardinal;
buf:
packed array of word;
begin
res := 0;
bufIndex := 0;
buf := bufv;
while (length > 1)
do
begin
inc(res, buf[bufIndex]);
inc(bufIndex);
dec(length, sizeof(word));
end;
res := (res
shr 16) + (res
and $FFFF);
inc(res, res
shr 16);
res := (
not res)
and $FFFF;
result := Integer(res);
end;
Der einzige groessere unterschied zur Implementierung oben ist, dass ich nicht buf, also den ArrayZeiger inkrementiere, sondern dass ich ueber einen Index (bufIndex) nacheinander auf die Elemente zugreife.
greetz
Mike