![]() |
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:
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.
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; 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 |
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) |
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) ![]() Kennst du abgesehen von DEC zufällig noch eine andere Unit die Crc Funktionen enthält ? |
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:
Hier ist die Tabelle schon fertig für das Polynom $1021 ausgerechnet.
// 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; 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? ![]() [add] Schonmal bei Tante Wiki nachgefragt? ![]() (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) |
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; |
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
![]()
Code:
Also nichts Überzeugendes. Wenn Du allerdings weitere Informationen, zB weitere Daten/CRC-Sätze oder Init/Xorout-Werte lieferst, kann ich Dir weiterhelfen.
===== 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 ===== |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 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