Einzelnen Beitrag anzeigen

ZOD

Registriert seit: 6. Mai 2009
97 Beiträge
 
#7

AW: CRC von C in Delphi übersetze

  Alt 24. Mär 2023, 12:07
eine erste Rückmeldung und Frage zur CRC Funktion:

das übergebene Funktionsargument pin ist nach meinem Verständnis ein Byte.
Es wird im Folgenden als Pointer auf das erste Zeichen der zu behandelnden Zeichenkette mit Länge len (2. Argument) verwendet.
Ich habe dies gefunden:
http://delphibasics.co.uk/RTL.php?Name=PAnsiChar

Um die CRC Funktion aufzurufen, verwende ich zum Test folgende Funktion:

Delphi-Quellcode:
function ErzeugeSolarisCRCWord(Text: string): word;
var
  tmpAnsiString: AnsiString;

  tmpPAnsiString: PByte;
  tmpPAnsiChar: PAnsiChar;

  tmpLength: Byte;

  tmpTextLength,
    i : integer;

begin
  // initialisieren
  result := 0;
  tmpTextLength := Length(Text);

  // validieren
  if ((tmpTextLength = 0) or (tmpTextLength > 256)) then
    exit;

  // Merker setzen
  tmpAnsiString := Text;
  i := 1;
  tmpPAnsiString := Addr(tmpAnsiString);
  tmpPAnsiChar := Addr(tmpAnsiString[i]);
  tmpLength := Length(tmpAnsiString);

  // CRC berechnen
  // function cal_crc_half(pin: PByte; len: Byte): Word;
  result := cal_crc_half(Addr(tmpPAnsiChar), tmpLength);

end;
Lasse ich das mit Text = 'QPIGS' laufen und setzte einen Haltepunkt vor dem Aufruf von cal_crc_half, habe ich folgende Werte:

Delphi-Quellcode:
  tmpPAnsiString = $12FBD8
  tmpPAnsiChar = 'QPIGS'
  tmpLength := 5

  Addr(tmpPAnsiChar) = $12FBD0
In der Funkton cal_crc_half ist nach der Zuweisung ptr := pin; der Wert von
Delphi-Quellcode:
  ptr = $12FBD0
  ptr^ = 12
Meinem bisherigen Verständnis nach sollte jedoch der derefernierte Wert von ptr ASCII-Wert des ersten Buchstaben von Text bzw. von tmpPAnsiChar sein - also "Q = ASCII 81". ptr^ liefert jedoch 12.

Ich verstehe das nicht, wahrscheinlich weil ich das Thema Pointer, AnsiChar und AnsiString nicht durchblickt habe.

Kann mir jemand helfen?
  Mit Zitat antworten Zitat