Thema: Delphi CRC-16 berechnen

Einzelnen Beitrag anzeigen

brose

Registriert seit: 20. Mai 2007
14 Beiträge
 
#1

CRC-16 berechnen

  Alt 11. Feb 2010, 22:01
Hallo Leute.

Ich habe einen gegebenen Datenstrom, zu dem der CRC-16 berechnet wurde. Um den Datenstrom zu beantworten, muss ich in das Antwort-Telegramm ebenfalls den CRC-Wert einbetten.

Dummerweise bekomme ich es aber nicht hin, diesen CRC-16 korrekt zu berechnen.


Der komplette Datenstrom ist (Hex-Werte)

00 00 00 0E (1) 7D 98 B2 00 (2) CE 64 (3) 00 00 00 00 01 01 01 01

Laut Dokumentation wird der CRC ab (1) berechnet, wobei für den Teil zwischen (2) und (3) die Werte 00 00 eingesetzt werden. Hier wird anschließend der CRC-Wert abgelegt.

Also muss der CRC-16 für 7D 98 B2 00 00 00 00 00 00 00 01 01 01 01 den Wert CE 64 annehmen.

Ich hab schon gegoogelt und getestet ohne Ende, aber ich komm nicht auf CE 64.
Auf http://zorc.breitbandkatze.de/crc.html und http://www.lammertbies.nl/comm/info/...lculation.html war ich schon.

Ich habs mit verschiedenen CRC-16 probiert, hab die Routinen aus dem "Delphi Encryption Compendium" von Hagen Reddmann benutzt und diese Lösung hier:

Delphi-Quellcode:
procedure TForm1.ByteCrc(data:byte;var crc:word);
VAR i:BYTE;
BEGIN
 FOR i:=0 TO 7 DO
  BEGIN
   IF ((data and $01)XOR(crc AND $0001)<>0) THEN
    BEGIN
     crc:=crc shr 1;
     crc:= crc XOR $A001;
    END
   ELSE crc:=crc shr 1;
   data:=data shr 1; // this line is not ELSE and executed anyway.
  END;
END;

function TForm1.StringCrc(s:shortstring):word;
var len,i:integer;
begin
 result:=$0;
 len:=length(s);
 for i:=1 to len do bytecrc(ord(s[i]),result);
end;

procedure TForm1.Button1Click(Sender: TObject);
var str:string; str2:shortstring;
i:integer;
begin
  str2 := {chr($00)+chr($00)+chr($00)+chr($0E)+}chr($7D)+chr($98)+chr($B2)+chr($00)+
   chr($00)+chr($00)+chr($00)+chr($00)+chr($00)+chr($00)+chr($01)
   +chr($01)+chr($01)+chr($01);

   edit1.text := inttohex(stringcrc(str2),4);

end;
auch das hier funktioniert nicht bzw. ich mach da was falsch:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  CRCcc16: Word;
  str :word;
begin
   str := $7D+$98+$B2+$00+$00+$00+$00+$00+$01+$01+$01+$01;

  CRCcc16 := CRCCalc(CRC_16,str, SizeOf(str));
   showmessage(inttohex(CRCcc16,0));

end;
Weiß jemand Rat, was ich da nun falsch mache???


Was ich grds. bis jetzt auch nicht so ganz verstanden habe ist, wie die CRC eigentlich bei so einem Strom berechnet wird. Die Beispiele gehten immer von 5 Bit o.ä. aus, die dann durchs Generator-Polynom geteilt werden. Das ist mir auch klar, aber ich muss doch die ganzen Hex-Bytes erstmal miteinander "verwursten" (addieren, XOR hintereinander verknüpfen, .... was ist mit Überträgen...), um dann 2 Byte = 16 Bit zu bekommen, die ich teilen kann? Oder denk ich da falsch?
  Mit Zitat antworten Zitat