CCITT CRC 16 Bits de la Valeur de Départ 0xffff

J'ai besoin de calculer un CCITT 16 bits valeur de somme de contrôle pour les données passées en paramètre avec la longueur. Si je remplis mon tableau TempStr avec les données de test "123456789", utiliser le polynôme 0x8408 avec la longueur en excluant le caractère de fin null, je reçois la chaîne de résultat 6E90(Hex). Avec la fin null char-je obtenir 907A. Quand j'échange le polynôme de 0x1201 puis-je obtenir des résultats 29E2(Hex), et EFE8(Hex) avec et sans caractère de fin.

Mes questions sont les suivantes:
Ai-je besoin pour calculer le CRC avec ou sans le caractère de fin null pour obtenir la valeur correcte?
Puis-je utiliser le polynôme 0x1201 ou l'inverse polynôme 0x8408 dans l'algorithme?
Est le bon CRC des données 0x29B1? J'ai besoin de la valeur correcte à déterminer si la fonction fonctionne correctement..
De l'algorithme pour calculer ce CRC type correct?
wData=(unsigned int)0xff & *pData++??
Si quelqu'un peut m'expliquer quel est le problème et comment le résoudre mon problème, j'aimerais beaucoup l'apprécier.
Merci

C'est le code qui utilise et affiche le calculate_CRC16 fonction:

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

C'est le calculate_CRC16 fonction:

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);
}
Je n'ai jamais vu CRC contrôles qui comprennent la valeur null ou des retours à la ligne ou quoi que ce soit. Pour les autres questions, désolé, pas assez d'un expert.
Si oui ou non la résiliation des valeurs null ou des retours à la ligne sont inclus dans le calcul du CRC est entièrement dépendante de savoir si elles font partie des données qui seront exécutées sur la fin de réception. Vous avez besoin d'appliquer la convention à toutes les données, l'autre extrémité s'appliquera de la CDE. Aussi garder à l'esprit que certaines fonctions de calcul de CRC besoin d'avoir des données factices (par exemple certains nombre de zéros) 'poussé' par le biais de la CRC fonction pour obtenir la valeur finale de la CRC d'un état interne de la machine. Cette règle s'applique en général à CRC fonctions qui sont conçus pour calculer un CRC sur plusieurs appels progressive des données.

OriginalL'auteur Ruaan Volschenk | 2014-01-21