CCITT CRC 16 Bit Startwert 0xffff

Muss ich berechnen CCITT 16-bit-Prüfsumme Wert für die Daten als parameter übergeben, zusammen mit der Länge. Wenn ich füllen mein array TempStr mit den test-Daten "123456789", verwenden Sie das Polynom 0x8408 mit der Länge ohne null-Terminierung-Charakter, habe ich das Ergebnis bekommen, das string-6E90(Hex). Zusammen mit der null-Terminierung char bekomme ich 907A. Wenn ich die swap-Polynom zu 0x1201 dann bekomme ich die Ergebnisse 29E2(Hex) und EFE8(Hex) mit und ohne Terminierung Charakter.

Meine Fragen sind:
Muss ich zum berechnen des CRC mit oder ohne null-Terminierung-Charakter zu erhalten, den richtigen Wert?
Verwende ich das Polynom 0x1201 oder das reverse Polynom 0x8408 in dem Algorithmus?
Ist die korrekte CRC der Daten 0x29B1? Ich brauche den richtigen Wert zu ermitteln, ob die Funktion korrekt funktioniert..
Ist der Algorithmus zur Berechnung dieses speziellen CRC-Typ korrekt?
wData=(unsigned int)0xff & *pData++??
Wenn jemand zu mir erklären können, was falsch ist und, wie zu beheben mein problem, würde ich viel schätzen.
Danke

Dies ist der code, verwendet und zeigt die calculate_CRC16 Funktion:

CHAR_t TestStr[] = {"123456789"};
unsigned short CrcTest = calculate_CRC16(TestStr,sizeof(TestStr)-1);
QString CrcDisplay = QString("CrcTest : %1").arg(CrcTest);
ui->txtDebug->setText(CrcDisplay);

Dies ist die calculate_CRC16 Funktion:

UINT16_t MainWindow::calculate_CRC16(CHAR_t* pData, UINT16_t wLength)
{

  UCHAR_t i;
  UINT16_t wData;
  UINT16_t wCrc = 0xffff;

  if (wLength == 0)
    return (~wCrc);

  do
  {
    for (i=0, wData=(unsigned int)0xff & *pData++; i < 8; i++, wData >>= 1)
    {
        if ((wCrc & 0x0001) ^ (wData & 0x0001))
            wCrc = (wCrc >> 1) ^ CRC_POLY;
        else  wCrc >>= 1;
    }
  } while (--wLength);

  wCrc = ~wCrc;
  wData = wCrc;
  wCrc = (wCrc << 8) | (wData >> 8 & 0xff);

  return (wCrc);
}
Ich habe nie gesehen, CRC-Prüfungen, die auch die abschließende null-oder line feeds oder sonstwas. Für die anderen Fragen, sorry, nicht genug von einem Experten.
Ob oder nicht-terminierenden null-oder line-feeds enthalten sind, in die CRC-Berechnung ist völlig davon abhängig, ob Sie einen Teil der Daten überprüft werden, die am empfangenden Ende. Sie müssen, um die CRC zu was auch immer Daten, die das andere Ende wird der CRC auf. Beachten Sie auch, dass einige CRC-Berechnung Funktionen müssen dummy-Daten (zum Beispiel eine gewisse Anzahl von Nullen) 'gedrängt' durch die CRC-Funktion, um die endgültige CRC aus einem internen state machine. Dies gilt in der Regel für eine CRC-Funktionen, die entworfen sind, zum berechnen einer CRC über mehrere Anrufe mit progressiven Daten.

InformationsquelleAutor Ruaan Volschenk | 2014-01-21

Schreibe einen Kommentar