AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

CRC16 Problem mit Input ASCII/Hex

Ein Thema von Zer0ne · begonnen am 9. Apr 2018 · letzter Beitrag vom 10. Apr 2018
Antwort Antwort
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.813 Beiträge
 
Delphi 12 Athens
 
#1

AW: CRC16 Problem mit Input ASCII/Hex

  Alt 10. Apr 2018, 07:14
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 #$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

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: CRC16 Problem mit Input ASCII/Hex

  Alt 10. Apr 2018, 08:44
Ich habe mal ein gebastelt, ausgehend von den vorliegenden Beispiel ist dies dabei rausgekommen:
Delphi-Quellcode:
unit uCRC16;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Function CalcCRC16(const Buffer: array of byte) : Word;
const
  Mask: Word = $A001;
var
  CRC: Word;
  N, I: Integer;
  B: Byte;
begin
  CRC := $FFFF;
  for I := Low(Buffer) to High(Buffer) do
  begin
    B := Buffer[I];
    CRC := CRC xor B;
    for N := 1 to 8 do
     if (CRC and 1) > 0 then
      CRC := (CRC shr 1) xor Mask
     else
      CRC := (CRC shr 1);
  end;
  Result := CRC;
  // Result := (IntToHex(CRC, 4)); (* Ausgabe *)
end;

function FileCRC16(const FileName: string; var CRC16: Word; StartPos: Int64 = 0;
  Len: Int64 = 0): Boolean;
const
  csBuff_Size = 4096;
type
  TBuff = array[0..csBuff_Size - 1] of Byte;
var
  Handle: THandle;
  ReadCount: Integer;
  Size: Int64;
  Count: Int64;
  Buff: TBuff;
begin
  Handle := CreateFile(PChar(FileName), GENERIC_READ,
    FILE_SHARE_READ, nil, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, 0);
  Result := Handle <> INVALID_HANDLE_VALUE;
  if Result then
  try
    Int64Rec(Size).Lo := GetFileSize(Handle, @Int64Rec(Size).Hi);
    if Size < StartPos + Len then
    begin
      Result := False;
      Exit;
    end;
    if Len > 0 then
      Count := Len
    else
      Count := Size - StartPos;
    CRC16 := not CRC16;
    SetFilePointer(Handle, Int64Rec(StartPos).Lo, @Int64Rec(StartPos).Hi, FILE_BEGIN);
    while Count > 0 do
    begin
      if Count > SizeOf(Buff) then
        ReadCount := SizeOf(Buff)
      else
        ReadCount := Count;
      ReadFile(Handle, Buff, ReadCount, LongWord(ReadCount), nil);
      CRC16 := CalcCRC16(Buff);
      Dec(Count, ReadCount);
    end;
    CRC16 := not CRC16;
  finally
    CloseHandle(Handle);
  end;
end;


// Hier wird CRC16 einer Datei Berechnet
procedure TForm1.Button1Click(Sender: TObject);
var
  CRC16: Word;
begin
  CRC16 := 0;
  if OpenDialog1.Execute then
   begin
    if FileCRC16(OpenDialog1.FileName, CRC16) then
    LabeledEdit2.Text := (IntToHex(CRC16, 4));
   end;
end;


// Hier wird CRC16 eines Strings Berechnet
procedure TForm1.Button2Click(Sender: TObject);
var
  s: String;
  buff: packed array of byte;
  i: Integer;
begin
  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;

end.
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#3

AW: CRC16 Problem mit Input ASCII/Hex

  Alt 10. Apr 2018, 09:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: CRC16 Problem mit Input ASCII/Hex

  Alt 10. Apr 2018, 09:25
Ja, verdammt noch eins, ich sollte lieber ausprobieren, was ich so blubbere
Mit einen Shortstring hätte es funktioniert, aber nur für 255 Byte

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

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Zer0ne

Registriert seit: 9. Apr 2018
6 Beiträge
 
#5

AW: CRC16 Problem mit Input ASCII/Hex

  Alt 10. Apr 2018, 09:57
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 #$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

Sherlock
Ich habe noch etwas herum probiert und, ja vermutlich mache ich noch mehr als genug falsch -.- aber mir der Variante
Zitat:
#$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:
#$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...
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: CRC16 Problem mit Input ASCII/Hex

  Alt 10. Apr 2018, 10:10
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]
Gruß vom KodeZwerg

Geändert von KodeZwerg (10. Apr 2018 um 10:21 Uhr)
  Mit Zitat antworten Zitat
Zer0ne

Registriert seit: 9. Apr 2018
6 Beiträge
 
#7

AW: CRC16 Problem mit Input ASCII/Hex

  Alt 10. Apr 2018, 10:15
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?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: CRC16 Problem mit Input ASCII/Hex

  Alt 10. Apr 2018, 10:26
Dafür ist doch das "Case" gedacht, entweder Zeichenweise oder Paarweise als Hex-Wert.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Zer0ne

Registriert seit: 9. Apr 2018
6 Beiträge
 
#9

AW: CRC16 Problem mit Input ASCII/Hex

  Alt 10. Apr 2018, 10:58
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
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: CRC16 Problem mit Input ASCII/Hex

  Alt 10. Apr 2018, 11:09
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:13 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