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?