Hallo.
Ich möchte folgenden Code von C++ nach Delphi übersetzen. Leider habe ich kaum Ahnung von der exakten Funktionsweise dieser Codestelle. Es soll eine spezielle Prüfsumme aus einer Datei gelesen werden. Die Datei kenne ich, die zu erwartende Prüfsumme auch. Ich kann aus dem Originalcode aber nicht mal erkennen, ab wann gelesen wird (was bedeutet z.B. "größer-gleich Leerzeichen"?).
C++:
Code:
unsigned short crc16(unsigned char data, unsigned short poly, unsigned short resl)
// Appends one byte to a runing CRC-16 calculation
{
int i;
resl^=(unsigned short)(((unsigned short)data)<<8);
for(i=8;i>0;--i)
{
if(resl&0x8000) resl=(unsigned short)((resl<<1)^poly);
else resl=(unsigned short)((resl<<1));
}
return (resl);
}
unsigned short file_crc16(char *fnam)
// Calculates the CRC-16 of the ISF file
{
FILE *finp;
unsigned char crcd;
unsigned short crcr;
if((finp=fopen(fnam,"rb"))==NULL) return(0xFFFF);
crcd='0'; crcr=0xFFFF;
while((fread(&crcd,1,1,finp)==1)&&(crcd>=' '));
while((fread(&crcd,1,1,finp)==1)&&(crcd>=' '));
while(fread(&crcd,1,1,finp)==1) crcr=crc16(crcd, 0x1021, crcr);
fclose(finp);
return(crcr);
}
Delphi Versuch (total Fehlerhaft):
Delphi-Quellcode:
function my_crc16(data: char; poly, resl: short): short;
var
i: integer;
begin
resl := resl xor (ord(data) shl 8);
for i := 8 downto 1 do
begin
if (resl and $8000) = $8000 then
begin
resl := (resl shl 1) xor poly;
end
else
begin
resl := resl shl 1;
end;
end;
result := resl;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
erg: integer;
i: integer;
tmp: string;
begin
erg := $FFFF;
for i := 1 to length(memo1.text) - 1 do
begin
tmp := copy(memo1.text, i, 1);
erg := ord(tmp[1]);
erg := my_crc16(chr(erg), $1021, erg);
end;
showmessage(inttohex(erg, 4));
end;
Ich wäre sehr froh, wenn mir jemand helfen könnte.
Gruß
blackdrake