AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CRC 8 berechnen ?

Ein Thema von Blamaster · begonnen am 2. Dez 2009 · letzter Beitrag vom 3. Dez 2009
Antwort Antwort
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#1

CRC 8 berechnen ?

  Alt 2. Dez 2009, 19:25
Hi,

In einem Microcontroller Projekt nutze ich ein Protokoll mit crc8 Checksumme. Nun würde ich gerne ein Delphi Programm schreiben, um mit dem Controller zu komunizieren.

Wie bekomme ich es nun in Delphi hin aus folgendem die Checksumme zu berechnen ?

Zahl1, Zahl2: integer;
Ausgabevariable:
crc: integer;

Ich hab mir schonmal auf Wikipedia einen Artikel zur Crc berechnung angesehen, komme da aber einfach nicht hinter wie ich das ganze in Delphi umsetzen kann. Es gibt ja scheinbar 2 Lösungsansätze einmal Schieberegister (langsam weniger Code) und Tabelle (schneller mehr Code).

Gibt es für die Bildung ggf. schon eine fertige function zum einbinden ?

Ich hoffe auf Eure Hilfe
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#2

Re: CRC 8 berechnen ?

  Alt 2. Dez 2009, 19:38
Es täte mich wundern (was ein Wortkonstrukt ), wenn im Delphi Encryption Compendium von negaH nix zu finden wäre...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

Re: CRC 8 berechnen ?

  Alt 2. Dez 2009, 19:44
Das Langsam oder Schnell sollte wurscht sein ... jedenfalls wird dein PC schneller die Prüfsumme berechntet haben (egal mit welchem Weg), als dein µP reagien kann

PS:
Zitat:
crc: integer;
Integer = aktuell 4 Byte aka 32 Bit
also würde das wohl einen CRC32 ergeben


und dann ist CRC8 nicht gleich CRC8, denn es gibt verschiedene Rechenweisen, bzw. unterschiedliche Verrechnungswerte (Polynom)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#4

Re: CRC 8 berechnen ?

  Alt 2. Dez 2009, 19:57
Hi,

Danke schonmal für die Antworten

Die DEC Units sind ja wirklich umfangreich.

Der µC Code ist mit bascom geschrieben. Ich kann nur leider nicht rausfinden welches Polynom dort genutzt wird, ich gehe allerdings davon aus das es einen durchgesetzten standard gibt ?

Das mit crc: integer; ist schon richtig. Ich möchte den Wert für weitere Verarbeitung in einer Integer Variable haben. Zum senden an den µC wandel ich diese dann als Ansi Char um und sende sie.

Wie müsste bei der DEC CRC Unit der Funktionsaufruf aussehen ? Da sind für eine einfache Crc 8 Berechnung recht viele Parameter dessen Wirkung mir nicht ganz klar ist.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#5

Re: CRC 8 berechnen ?

  Alt 2. Dez 2009, 20:00
http://www.mikrocontroller.net/topic/9929

für CRC8 macht sich ein Byte doch eigentlich schon besser?
jedenfalls wäre es vollkommen ausreichend

[add]
dort hast du ein Beispiel für's DEC und müßtest dann wohl CRC_8 oder was Ähnliches als Type verwenden
http://www.delphipraxis.net/internal...highlight=crc8

Delphi-Quellcode:
const
  CRC8Table: array[0..255] of Byte = (
    $00, $07, $0E, $09, $1C, $1B, $12, $15,
    $38, $3F, $36, $31, $24, $23, $2A, $2D,
    $70, $77, $7E, $79, $6C, $6B, $62, $65,
    $48, $4F, $46, $41, $54, $53, $5A, $5D,
    $E0, $E7, $EE, $E9, $FC, $FB, $F2, $F5,
    $D8, $DF, $D6, $D1, $C4, $C3, $CA, $CD,
    $90, $97, $9E, $99, $8C, $8B, $82, $85,
    $A8, $AF, $A6, $A1, $B4, $B3, $BA, $BD,
    $C7, $C0, $C9, $CE, $DB, $DC, $D5, $D2,
    $FF, $F8, $F1, $F6, $E3, $E4, $ED, $EA,
    $B7, $B0, $B9, $BE, $AB, $AC, $A5, $A2,
    $8F, $88, $81, $86, $93, $94, $9D, $9A,
    $27, $20, $29, $2E, $3B, $3C, $35, $32,
    $1F, $18, $11, $16, $03, $04, $0D, $0A,
    $57, $50, $59, $5E, $4B, $4C, $45, $42,
    $6F, $68, $61, $66, $73, $74, $7D, $7A,
    $89, $8E, $87, $80, $95, $92, $9B, $9C,
    $B1, $B6, $BF, $B8, $AD, $AA, $A3, $A4,
    $F9, $FE, $F7, $F0, $E5, $E2, $EB, $EC,
    $C1, $C6, $CF, $C8, $DD, $DA, $D3, $D4,
    $69, $6E, $67, $60, $75, $72, $7B, $7C,
    $51, $56, $5F, $58, $4D, $4A, $43, $44,
    $19, $1E, $17, $10, $05, $02, $0B, $0C,
    $21, $26, $2F, $28, $3D, $3A, $33, $34,
    $4E, $49, $40, $47, $52, $55, $5C, $5B,
    $76, $71, $78, $7F, $6A, $6D, $64, $63,
    $3E, $39, $30, $37, $22, $25, $2C, $2B,
    $06, $01, $08, $0F, $1A, $1D, $14, $13,
    $AE, $A9, $A0, $A7, $B2, $B5, $BC, $BB,
    $96, $91, $98, $9F, $8A, $8D, $84, $83,
    $DE, $D9, $D0, $D7, $C2, $C5, $CC, $CB,
    $E6, $E1, $E8, $EF, $FA, $FD, $F4, $F3);

function CRC8(const s: ansistring): Byte;
var
  i, iLen, iStep: Integer;
begin
  Result := 0;
  iLen := Length(s);
  if iLen < 32 then
  begin
    for i := 1 to iLen do
    begin
      Result := CRC8Table[Result xor Byte(s[i])];
    end;
  end
  else
  begin
    iStep := iLen div 32 + 1;
    i := 1;
    while i < iLen do
    begin
      Result := CRC8Table[Result xor Byte(s[i])];
      Inc(i, iStep);
    end;
  end;
end;
wobei mir die Berechnung, bei 32 und mehr Zeichen, eigenartig vorkommt
und ich es daher auch mal nur so probieren würde
Delphi-Quellcode:
function CRC8(const s: ansistring): Byte;
var
  i: Integer;
begin
  Result := 0;
  for i := 1 to Length(s) do
    Result := CRC8Table[Result xor Byte(s[i])];
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#6

Re: CRC 8 berechnen ?

  Alt 2. Dez 2009, 22:23
@ himitsu

Stimmt die oberste funktion scheint etwas aufweniger gestaltet zu sein wieso auch immer.

Ich bin jetzt etwas weitergekommen.

Ich weiß nun schonmal soviel.

A: array[0..2] of byte;

A[0] := 1
A[1] := 2
A[2] := 3

Die Crc8 der 3 Bytes müsste 216 ergeben.

Außerdem habe ich noch folgendes VB beispiel dazu gefunden:
Delphi-Quellcode:
Function Docrc8(s As String) As Byte
Dim j As Byte
Dim k As Byte
Dim crc8 As Byte
crc8 = 0
For m = 1 To Len(s)
x = Asc(Mid(s, m, 1))
For k = 0 To 7
j = 1 And (x Xor crc8)
crc8 = Fix(crc8 / 2) And &HFF
x = Fix(x / 2) And &HFF
If j <> 0 Then
crc8 = crc8 Xor &H8C
End If
Next k
Next
Docrc8 = crc8
End Function
Lässt das Rückschlüsse auf das verwendete Polynom zu ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

Re: CRC 8 berechnen ?

  Alt 2. Dez 2009, 23:24
ich würde es so übersetzen ... und hoff' es stimmt.
Delphi-Quellcode:
function CRC8(const s: AnsiString): Byte;
var j, k, x: Byte;
  m: Integer;
begin
  Result := 0;
  for m := 1 to Length(s) do begin
    x := Ord(s[m]);
    for k := 0 to 7 do begin
      j := 1 and (x xor Result);
      Result := Result div 2;
      x := x div 2;
      if j <> 0 then Result := Result xor $8C;
    end;
  end;
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
gammatester

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

Re: CRC 8 berechnen ?

  Alt 2. Dez 2009, 23:33
Zitat von Blamaster:
@ himitsu
Ich weiß nun schonmal soviel.

A: array[0..2] of byte;

A[0] := 1
A[1] := 2
A[2] := 3

Die Crc8 der 3 Bytes müsste 216 ergeben.
...

Lässt das Rückschlüsse auf das verwendete Polynom zu ?
Aber sicher, das Poly ist $8C. Hier ein Programm für Deinen Fall
Delphi-Quellcode:
program crc8blam;

{$ifdef win32}
{$apptype console}
{$endif}
const
  test: array[0..2] of byte = (1,2,3);

{---------------------------------------------------------------------------}
function crc8_blamaster(const b: array of byte): byte;
  {-CRC8 für Blamaster}
const
  Poly = $8C;
  {Rocksoft parameter:
  (poly  : $31;  // $8C reflected
    init  : $00;
    xorout : $00;
    check  : $F4;
    width  : 8;
    refin  : true;
    refout : true;)
  }

var
  crc: byte;
  i,j: integer;
begin
   crc := 0;
   for i:=low(b) to high(b) do begin
     crc := crc xor b[i];
     for j:=1 to 8 do begin
       if odd(crc) then crc := (crc shr 1) xor Poly
       else crc := crc shr 1;
     end;
   end;
   crc8_blamaster := crc;
end;


begin
  writeln('Test:',crc8_blamaster(test));
end.
Kannst Du mit beliebigem array of byte aufrufen. Info zum Rocksoftmodel auf meiner CRC-Seite

Ausgabe des Programms:
Code:
D:\BP_WE\WORK\CRC_HASH>D:\DMX\M10\DCC32 -b crc8blam.pas
Borland Delphi for Win32 compiler version 18.0
Copyright (c) 1983,2005 Borland Software Corporation
crc8blam.pas(42)
43 lines, 0.10 seconds, 12152 bytes code, 12168 bytes data.

D:\BP_WE\WORK\CRC_HASH>crc8blam.exe
Test:216
Gruß Gammatester
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#9

Re: CRC 8 berechnen ?

  Alt 3. Dez 2009, 15:28
Hi,

Vielen Dank, damit funktioniert es perfekt
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz