Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi CRC-CCITT-16 0x8811 (https://www.delphipraxis.net/168791-crc-ccitt-16-0x8811.html)

Blamaster 11. Jun 2012 19:04

Delphi-Version: 7

CRC-CCITT-16 0x8811
 
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

himitsu 11. Jun 2012 19:17

AW: CRC-CCITT-16 0x8811
 
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)

Blamaster 11. Jun 2012 19:37

AW: CRC-CCITT-16 0x8811
 
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 ?

himitsu 11. Jun 2012 20:04

AW: CRC-CCITT-16 0x8811
 
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)

Blamaster 11. Jun 2012 20:44

AW: CRC-CCITT-16 0x8811
 
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;

gammatester 12. Jun 2012 08:46

AW: CRC-CCITT-16 0x8811
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 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