Tipps und Hinweise sind ausdrücklich willkommen!
Wenn deine Vorgaben vollständig waren, sollte das die Lösung sein:
Delphi-Quellcode:
{$R-}
function CalcCRC(const pmcText: AnsiString): Word;
const
CRC_TABLE: array[0..15] of Word = (
$0000, $1021, $2042, $3063, $4084, $50a5, $60c6, $70e7,
$8108, $9129, $a14a, $b16b, $c18c, $d1ad, $e1ce, $f1ef);
var
p: PAnsiChar;
crc: Word;
tbl: Byte;
crcLo: Byte;
crcHi: Byte;
begin
if pmcText = '' then Exit(0); //=>
crc := 0;
p := Pointer(pmcText);
while p^ <> #0 do
begin
tbl := crc shr 12;
crc := crc shl 4;
crc := crc xor CRC_TABLE[tbl xor (Ord(p^) shr 4)];
tbl := crc shr 12;
crc := crc shl 4;
crc := crc xor CRC_TABLE[tbl xor (Ord(p^) and $0f)];
Inc(p);
end;
crcLo := crc and $ff;
crcHi := crc shr 8;
if (crcLo = $28) or (crcLo = $0d) or (crcLo = $0a) then
Inc(crcLo);
if (crcHi = $28) or (crcHi = $0d) or (crcHi = $0a) then
Inc(crcHi);
crc := (crcHi shl 8) + crcLo;
Result := crc;
end;
{$R+}
Die Übersetzung ist nahe am C-Code und bestätigt die Doku:
Delphi-Quellcode:
var
txt: AnsiString;
begin
txt := 'QPIGS';
ShowMessage(CalcCRC(txt).ToHexString(4)); // => $B7A9
Bis bald...
Thomas