AGB  ·  Datenschutz  ·  Impressum  







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

CRC-CCITT-16 0x8811

Ein Thema von Blamaster · begonnen am 11. Jun 2012 · letzter Beitrag vom 12. Jun 2012
Antwort Antwort
Blamaster

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

CRC-CCITT-16 0x8811

  Alt 11. Jun 2012, 20:04
Delphi-Version: 7
Hi,

ich habe Probleme mit der Berechnung einer CRC-CCITT-16 0x8811

Momentan benutze ich den folgenden Code zur Berechnung der Crc

Code:
function crc16(const b: array of byte): Word;
var
  CRC: Word;
  i, j: integer;
begin
  crc := $FFFF;
  for i := 0 to length(b) - 1 do
  begin
    crc := crc xor b[i] shl 8;
    for j := 1 to 8 do
      if ((crc and $8000) <> 0) then
        crc := ((crc shl 1) xor $1021)
      else
        crc := (crc shl 1)
  end;
  result := (crc and $FFFF);
end;
Hat bisher für die normale Crc16 CCITT auch immer super funktioniert. Nun wird aber scheinbar ein andres Polynom verwendet und ich bekomme es nicht richtig angepasst.

14 0 0 39 38 1 249 240 255 13 255 müsste als Crc 0xE28B ergeben. Ich komme allerdings egal was ich mache nicht auf diese Crc.

Jemand eine Idee woran es liegen könnte ?

Gruß Yannic
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: CRC-CCITT-16 0x8811

  Alt 11. Jun 2012, 20:17
Der Code ist auch nicht das Wahre.

Meistens wird mit eine Table gerechnet, welche vorher über das Polynom erstellt wurde.
Also es wird je nach Position/Eingangswert mit einem anderem XOR-Wert gearbeitet.
Du rechnest aber immer mit dem selben Wert (xor $1021).

Ich würde mir einen anderen Code suchen. (gibt ja genügend, wie z.B. im DEC und in vielen anderen Hash/Crypt-Libs)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Blamaster

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

AW: CRC-CCITT-16 0x8811

  Alt 11. Jun 2012, 20:37
Die DEC habe ich auch schon getestet, aber aus welchem Grund auch immer komme ich mit jeder Crc Unit auf komplett andere Ergebnisse.

Ich habe mittlerweile bestimmt schon an die 8 verschiedenen Crc Berechnungscodes verwendet aber keiner kam auf das passende Ergebnis.

Der oben gepostete Crc Code liefert mir zumindest exakt den gleichen Crc Wert wie diese Website hier unter CRC-CCITT (0xFFFF)

http://www.lammertbies.nl/comm/info/...lculation.html

Kennst du abgesehen von DEC zufällig noch eine andere Unit die Crc Funktionen enthält ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: CRC-CCITT-16 0x8811

  Alt 11. Jun 2012, 21:04
Du kannst dir die Quellcodes dieser Seite runterladen.
(mußt dir nur noch das Wichtigste raussuchen und dann von C++ nach Delphi übersetzen)

Delphi-Quellcode:
// Tabelle nach CRC-CCITT Polynom=$1021 = x^16 + x^12 + x^5 + 1
const
  Crc16Tab: array[0..255] of Word = (
    $0000, $1021, $2042, $3063, $4084, $50a5, $60c6, $70e7, $8108, $9129, $a14a, $b16b, $c18c, $d1ad, $e1ce, $f1ef,
    $1231, $0210, $3273, $2252, $52b5, $4294, $72f7, $62d6, $9339, $8318, $b37b, $a35a, $d3bd, $c39c, $f3ff, $e3de,
    $2462, $3443, $0420, $1401, $64e6, $74c7, $44a4, $5485, $a56a, $b54b, $8528, $9509, $e5ee, $f5cf, $c5ac, $d58d,
    $3653, $2672, $1611, $0630, $76d7, $66f6, $5695, $46b4, $b75b, $a77a, $9719, $8738, $f7df, $e7fe, $d79d, $c7bc,
    $48c4, $58e5, $6886, $78a7, $0840, $1861, $2802, $3823, $c9cc, $d9ed, $e98e, $f9af, $8948, $9969, $a90a, $b92b,
    $5af5, $4ad4, $7ab7, $6a96, $1a71, $0a50, $3a33, $2a12, $dbfd, $cbdc, $fbbf, $eb9e, $9b79, $8b58, $bb3b, $ab1a,
    $6ca6, $7c87, $4ce4, $5cc5, $2c22, $3c03, $0c60, $1c41, $edae, $fd8f, $cdec, $ddcd, $ad2a, $bd0b, $8d68, $9d49,
    $7e97, $6eb6, $5ed5, $4ef4, $3e13, $2e32, $1e51, $0e70, $ff9f, $efbe, $dfdd, $cffc, $bf1b, $af3a, $9f59, $8f78,
    $9188, $81a9, $b1ca, $a1eb, $d10c, $c12d, $f14e, $e16f, $1080, $00a1, $30c2, $20e3, $5004, $4025, $7046, $6067,
    $83b9, $9398, $a3fb, $b3da, $c33d, $d31c, $e37f, $f35e, $02b1, $1290, $22f3, $32d2, $4235, $5214, $6277, $7256,
    $b5ea, $a5cb, $95a8, $8589, $f56e, $e54f, $d52c, $c50d, $34e2, $24c3, $14a0, $0481, $7466, $6447, $5424, $4405,
    $a7db, $b7fa, $8799, $97b8, $e75f, $f77e, $c71d, $d73c, $26d3, $36f2, $0691, $16b0, $6657, $7676, $4615, $5634,
    $d94c, $c96d, $f90e, $e92f, $99c8, $89e9, $b98a, $a9ab, $5844, $4865, $7806, $6827, $18c0, $08e1, $3882, $28a3,
    $cb7d, $db5c, $eb3f, $fb1e, $8bf9, $9bd8, $abbb, $bb9a, $4a75, $5a54, $6a37, $7a16, $0af1, $1ad0, $2ab3, $3a92,
    $fd2e, $ed0f, $dd6c, $cd4d, $bdaa, $ad8b, $9de8, $8dc9, $7c26, $6c07, $5c64, $4c45, $3ca2, $2c83, $1ce0, $0cc1,
    $ef1f, $ff3e, $cf5d, $df7c, $af9b, $bfba, $8fd9, $9ff8, $6e17, $7e36, $4e55, $5e74, $2e93, $3eb2, $0ed1, $1ef0);

function crc16(const b: array of byte): Word;
var
  i: Integer;
begin
  Result := 0;
  for i := 0 to Length(b) - 1 do
    Result := Crc16Tab[((Result shr 8) xor b[i])) and $ff] xor (Result shl 8);
end;
Hier ist die Tabelle schon fertig für das Polynom $1021 ausgerechnet.

Muß mal sehn, ob ich die Berechnungsfunktion dafür finde, dann könnte man auch andere Polynome verwenden, oder du besorgst dir irgendwo passende vorberechnete Werte.


[edit]
Vielleicht ist da auch was passendes drin?
http://www.delphipraxis.net/147576-c...berechnen.html




[add]
Schonmal bei Tante Wiki nachgefragt?
http://de.wikipedia.org/wiki/Zyklisc...nzpr%C3%BCfung (sogar mit Delphi-Code)
(der Code ist vielleicht noch nicht optimal, da er das Polynom bei jedem Schrit einzen einrechnet, anstatt das schon vorzuberechnen und als schnelle Tabelle anzubieten, aber egal)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (11. Jun 2012 um 21:10 Uhr)
  Mit Zitat antworten Zitat
Blamaster

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

AW: CRC-CCITT-16 0x8811

  Alt 11. Jun 2012, 21:44
Hmm,

wenn ich den Wiki Code benutze komme ich auch nicht auf die passende CRC

Code:
function crc16_2(const buffer: array of byte): Word;
var
  CRC: Word;
  Poly: Word;
  N, I: Integer;
  B: Byte;
begin
  Poly := $8811;
  CRC := $FFFF;
  for i := 0 to length(Buffer) - 1 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 Poly
      else
        CRC := CRC shr 1;
  end;
  Result := CRC;
end;
  Mit Zitat antworten Zitat
gammatester

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

AW: CRC-CCITT-16 0x8811

  Alt 12. Jun 2012, 09:46
Die große Preisfrage ist, was bedeutet CRC-CCITT-16 0x8811. Normalerweise würde ich erwarten, daß 0x8811 das Generator-Polynom ist. Allerdings ist 0x8811 völlig ungewöhnlich. Woher hast Du das? In Deinem eigenen Code sehe ich nix wie $8811! Aber nehmen wir mal an, es stimmt. Mein Opensource CRC16-Suchprogramm SRP16 (via http://www.wolfgang-ehrhardt.de/crch...l#crchash_demo) liefert für Deine Werte
Code:
===== Checking for known algorithms =====
Checked data sets
CRC1: $e28b,  Data1: 0E0000272601F9F0FF0DFF
===== done =====

===== Result parameter sets =====
CRC=$e28b Poly=$8811  init=$0b97  xorout=$ffff refin=false refout=true
CRC=$e28b Poly=$8811  init=$1787  xorout=$0000  refin=false refout=false
CRC=$e28b Poly=$8811  init=$2926  xorout=$ffff refin=false refout=false
CRC=$e28b Poly=$8811  init=$3536  xorout=$0000  refin=false refout=true
CRC=$e28b Poly=$8811  init=$4064  xorout=$ffff refin=true  refout=false
CRC=$e28b Poly=$8811  init=$5c74  xorout=$0000  refin=true  refout=true
CRC=$e28b Poly=$8811  init=$62d5  xorout=$ffff refin=true  refout=true
CRC=$e28b Poly=$8811  init=$7ec5  xorout=$0000  refin=true  refout=false
CRC=$8be2  Poly=$8811  init=$8b36  xorout=$ffff refin=true  refout=false
CRC=$8be2  Poly=$8811  init=$9726  xorout=$ffff refin=true  refout=true
CRC=$8be2  Poly=$8811  init=$a987  xorout=$0000  refin=true  refout=true
CRC=$8be2  Poly=$8811  init=$b597  xorout=$0000  refin=true  refout=false
CRC=$8be2  Poly=$8811  init=$c0c5  xorout=$0000  refin=false refout=true
CRC=$8be2  Poly=$8811  init=$dcd5  xorout=$0000  refin=false refout=false
CRC=$8be2  Poly=$8811  init=$e274  xorout=$ffff refin=false refout=false
CRC=$8be2  Poly=$8811  init=$fe64  xorout=$ffff refin=false refout=true
===== done =====
Also nichts Überzeugendes. Wenn Du allerdings weitere Informationen, zB weitere Daten/CRC-Sätze oder Init/Xorout-Werte lieferst, kann ich Dir weiterhelfen.
  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 03:04 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