Stimmt dieser CRC Algo?



  • Hallo Leute,

    da ich eine CRC über mehrere Bytes (so ca. 128Byte) machen muss,
    habe ich folgenden Code bekommen, nur weis ich nicht, ob er das richtige macht.
    Habe schon im Web nach Algos gesucht, sind zwar alle ziemlich ähnlich, jedoch gibt es schon unterschiede.

    Also hier:

    uint16 Crc8::computeCrc8( uint8* data, uint16 len)
    {
      uint16 help_value;
            uint16 m_crc_value = 0xFFFFu;
            uint16 m_crc_polynomial_16 = 0x13u;
    
      while (len-- > 0)
      {
            uint8 i;        /* loop counter 1..8     */
          m_crc_value ^= ((uint16)(*(data++)) << 8); 
    
        for (i = 0; i < 8; i++)
            {
                //0x8000 = binary 1000 0000 0000 0000
          if ((m_crc_value & (uint16)0x8000u) > 0)
          {
            m_crc_value = (m_crc_value << 1) ^ m_crc_polynomial_16;
          }
          else
          {
            m_crc_value <<= 1;
          }
        }
      }
      help_value = m_crc_value;
      m_crc_value = 0xFFFFu;
      return help_value;
    }
    

    wenn ich das char 'A' mit seinem ASCI-Wert 0x65 also bin 1000001 mit dem Generatorpolynom 10011 berechne bekomme ich nach dem oberem Code den CRC 0x14.

    Wenn ich es mit dem folgenden Rechner mache bekomme ich 0x04.
    http://www.flechtmann.net/crc/index.php

    Also ist die berechnung doch irgendwie falsch.



  • JDHawk schrieb:

    uint16 m_crc_polynomial_16 = 0x1021u;

    sieht so aus wie der CRC vom ITU (international telecommunications union)
    ansonsten gibts ist noch der von CCITT sehr verbreitet.
    naja, wichtig ist ja nur, dass alle teilnehmer den gleichen CRC verwenden.
    🙂



  • Ja mag sein, dass es ein standardisiertes Generatorpolynom ist,
    nur ich glaube meine Berechnung ist falsch.

    Vielleicht implementiere ich sie doch lieber selbst.



  • Wie würde man denn ein längeres Frame berechnen,
    sagem wir mal eine CRC Summe über 10 Byte?

    Würde man dann die ganen 10Byte zur Division hernehmen oder immer Byteweise?
    Und wenn byteweise, wie würde man das machen?



  • CCITT ist hier http://www.embeddedforth.de/3-eV/emb3.pdf ganz gut allgemein erklärt, so kannst Du wirklich gut testen, ob das stimmt, was Dein Code macht. 🙂
    Verbesserte CRCs findest Du in der Embedded 11 http://www.embeddedforth.de/11-eV/emb11.pdf 😃



  • Interessante Artikel,

    jedoch so hardwarenah muss man es auch nicht wissen.

    Dennoch danke, da man sehr interessante Dinge erfährt!

    Mich würde aber immernoch interessieren, wiw man es macht wenn die Daten aus mehreren Bytes bestehen.



  • JDHawk schrieb:

    Mich würde aber immernoch interessieren, wiw man es macht wenn die Daten aus mehreren Bytes bestehen.

    Steht eigentlich auch drin und wenn Du FORTH- Source halbwegs verstehst, könntest Du eine Referenzimplementation von der gleichen Domain ziehen.
    Ich hab' mich damit nie näher damit befassen müssen, weil in den Prozessoren, die ich verwende, eine HW- CRC32 drin ist, hat immer funktioniert, no more thoughts on it ... 😃


Anmelden zum Antworten