Ich hab mich mal an CRC16 versucht, konnte es aber nicht testen (und aus einer Stelle bin ich nicht so richtig schlau geworden):
Delphi-Quellcode:
function CRC16(CRC: Word;
const Buffer; Size: Cardinal): Word;
{$IFDEF PUREPASCAL}
{$MESSAGE WARN 'UNTESTED CODE: CRC16'}
// EAX = CRC
// EDX = Buffer
// ECX = Size
var
Lookup: PCRCDef;
BufferByte: PByte;
B: Byte;
begin
if Size=0
then
begin
Result := CRC;
exit;
end;
{$IFDEF PIC}
// I assume this line exists in the original to use the code from a class
// with a custom lookup table which is not possible with pure pascal
{$MESSAGE ERROR 'MOV ESI,[EBX].FCRC16 ??'}
{$ELSE}
Lookup := FCRC16;
{$ENDIF}
// EDI = Size
// ESI = Lookup
if not Assigned(Lookup)
then
Lookup := CRC16Init;
// CL = B
BufferByte := PByte(@Buffer);
repeat
B := BufferByte^
xor Byte(CRC);
CRC := (CRC
shr 8)
xor Lookup.Table[B];
inc(BufferByte);
dec(Size);
until Size=0;
Result := CRC;
end;
Wär super, wenn du ein paar
Unit-Tests bereitstellen könntest.
(Btw: Könntest du mich als Isopod in die Credits schreiben? Ich heiße inzwischen fast überall so (oder ähnlich))