Einzelnen Beitrag anzeigen

blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Spezielles CRC-16: Übersetzung aus C++ (omg)

  Alt 13. Apr 2008, 02:37
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
Daniel Marschall
  Mit Zitat antworten Zitat