AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Spezielles CRC-16: Übersetzung aus C++ (omg)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von blackdrake · begonnen am 13. Apr 2008 · letzter Beitrag vom 14. Apr 2008
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz