Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   CRC16 Problem mit Input ASCII/Hex (https://www.delphipraxis.net/195940-crc16-problem-mit-input-ascii-hex.html)

p80286 10. Apr 2018 10:25

AW: CRC16 Problem mit Input ASCII/Hex
 
Zitat:

Zitat von Sherlock (Beitrag 1398600)
Ja, verdammt noch eins, ich sollte lieber ausprobieren, was ich so blubbere :oops:

Mit einen Shortstring hätte es funktioniert, aber nur für 255 Byte :stupid:

Irgendjemand hat hier vor einiger Zeit geschrieben "Vergewaltigung eines Strings", recht hat er!

Gruß
K-H

gammatester 10. Apr 2018 10:29

AW: CRC16 Problem mit Input ASCII/Hex
 
Zitat:

Zitat von KodeZwerg (Beitrag 1398606)
Aber meine Datei-CRC Methode ist glaube ich fehlerhaft an dieser Stelle hier "CRC16 := CalcCRC16(Buff);"
Irgendwie hab ich da noch einen Logik-Fehler drinn, komm grad nur nicht drauf wie ich ihn behebe, momentan wird immer eine neue crc16 gegeben ohne die alte zu berücksichtigen.

Du berechnest ja immer nur den CRC des letzten Blocks. Deine CRC-Routine braucht CRC als var parameter. Aufruf dann mit CRC16.
Initialisiert wird extern mit CRC16:=$FFFF.

Zer0ne 10. Apr 2018 10:57

AW: CRC16 Problem mit Input ASCII/Hex
 
Zitat:

Zitat von Sherlock (Beitrag 1398600)
Zitat:

Zitat von himitsu (Beitrag 1398563)
Zitat:

Zitat von Sherlock (Beitrag 1398560)
Du mußt die Zeichen als Hex angeben.

Und dann bei Chars $A0, $A8 und paar Anderen ab $F0 könnte er sich wundern, wenn die wegen ANSI<>Unicode nicht das sind was sie sein sollten. -> konvertierte Codepage

UND
Delphi-Quellcode:
#$02+#$0D+...
Zitat:

Deine Variante funktioniert hier an der Stelle so leider nicht.
Keine Sorge, in Delphi geht das auch so nicht.

Ja, verdammt noch eins, ich sollte lieber ausprobieren, was ich so blubbere :oops:

Sherlock

Ich habe noch etwas herum probiert und, ja vermutlich mache ich noch mehr als genug falsch -.- aber mir der Variante
Zitat:

Delphi-Quellcode:
#$02+#$0D+...

funktioniert es! Da erhalte ich den richtigen CRC Wert heraus.

Jetzt habe ich aber z.B. durch vorhergehende Schritte z.B. einen String
Zitat:

command := '020D000A413068656C6C6F';
. Nur wie wandele ich den jetzt um, dass ich genau die oben beschriebene Form
Zitat:

Delphi-Quellcode:
#$02+#$0D+...

erhalte?

Ja, ich weiß es ist eine String-Vergewaltigung, aber es erscheint zur Zeit für mich die sinnvollste Lösung für mein Problem...

KodeZwerg 10. Apr 2018 11:10

AW: CRC16 Problem mit Input ASCII/Hex
 
Ich habe mal die String-Nach-CRC16 überarbeitet aber bekomme dennoch andere Ergebnisse.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  s: String;
  buff: packed array of byte;
  i: Integer;
begin
  case RadioGroup1.ItemIndex of
   0: begin // Input ist String
       s := LabeledEdit1.Text;
       SetLength(buff, Length(s));
       for i := 0 to (Length(s))-1 do buff[i] := Byte(Ord(s[i+1]));
       LabeledEdit2.Text := (IntToHex(CalcCRC16(buff), 4));
      end;
   1: begin // Input ist Hex-Kette als String (Beispiel 020D000A413068656C6C6F)
       s := LabeledEdit1.Text;
       SetLength(buff, Length(s) div 2);
       for i := 0 to (Length(s) div 2)-1 do
        buff[i] := Byte(StrToInt('$'+s[i*2+1]+s[i*2+2]));
       LabeledEdit2.Text := (IntToHex(CalcCRC16(buff), 4));
      end;
  end;
end;
für String "020D000A413068656C6C6F" erhalte ich "A881" und als Hex-Kette kommt "199A" raus.
Bestimmt mach ich irgendwo noch mehr falsch. :-(

[Edit]
Ob Hex-Kette überhaupt funktioniert hab ich so getestet
In meine String-Eingabe entweder Wert "1" oder "31", als String oder als Hex, beides resultiert in "947E"
[/Edit]

Zer0ne 10. Apr 2018 11:15

AW: CRC16 Problem mit Input ASCII/Hex
 
Zitat:

Zitat von KodeZwerg (Beitrag 1398615)
für String "020D000A413068656C6C6F" erhalte ich "A881" und als Hex-Kette kommt "199A" raus.
Bestimmt mach ich irgendwo noch mehr falsch. :-(

Ich glaube an der Stelle ist der Fehler, dass die Zeichen einzeln betrachtet werden und nicht als Paare, wie sie gedacht sind -> #02#0D.... (hier aber #0#2#0#D...) oder irre ich mich?

KodeZwerg 10. Apr 2018 11:26

AW: CRC16 Problem mit Input ASCII/Hex
 
Dafür ist doch das "Case" gedacht, entweder Zeichenweise oder Paarweise als Hex-Wert.

Zer0ne 10. Apr 2018 11:58

AW: CRC16 Problem mit Input ASCII/Hex
 
Hast du den korrekten Start?
Zitat:

CRC := $0000;
Weil bei einem deiner vorherigen Posts stand noch
Zitat:

CRC := $FFFF;
Mit der 0 als Startwerte funktioniert es jetzt endlich :-D

KodeZwerg 10. Apr 2018 12:09

AW: CRC16 Problem mit Input ASCII/Hex
 
Ich hatte mich da an das gepostete Beispiel für "So und nicht anders" gehalten, da stand's halt mit $FFFF definiert und ja Du hast recht, so bekomme ich in beiden Cases das korrekte Ergebniss, freut mich das nun alles klappt.
Das mit der Datei ist ja egal, war nur so ein Nebendingens.

Zer0ne 10. Apr 2018 12:14

AW: CRC16 Problem mit Input ASCII/Hex
 
Auf jeden Fall, vielen Dank an alle, die versucht haben zu helfen.

Wer weiß, wie lange ich da sonst noch daran gehängt hätte. :-)

KodeZwerg 10. Apr 2018 12:18

AW: CRC16 Problem mit Input ASCII/Hex
 
Ich sollte noch anmerken, der Code enthält keine Fehlerbehandlung, also auf Input-Korrektheit sollte entweder im Vorfeld oder in meinem Beispiel Code ergänzt werden, Ansätze hätte man ja, Code kann auch noch gekürzt werden, momentan alles ausführlich zum Testen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 Uhr.
Seite 2 von 3     12 3      

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 by Thomas Breitkreuz