Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
08/12/07 17:58
Read: times


 
#143127 - Your observations plus a comparison in C
Responding to: ???'s previous message
Russ Cooper said:
Have you run into articles like this one that raise some doubt about how a correct implementation of CCITT CRC-16 is really supposed to work? It points out that many websites (including the online CRC calculator that you have mentioned) give 29B1h as the CRC for the test string "123456789". However, the author of the site believes for one reason or another that the correct result is actually E5CCh.

I don't suppose this would matter too much if your use of the algorithm was limited only to your own programs. Of course it would matter a lot if you were exchanging data with somebody else's program that calculated the CRCs differently.

If I recall correctly, that author's conjecture about the correct result is know to be wrong. Your issue about needing to know all the parameters for correct implementation (initial value, bit processing order, complementing final value, etc.) is well founded.

Here's a C implementation of the type of algorithm that Jan posted, but that processes the bits in the LSBit-first order as they would be on-the-wire for UART exchange and as defined by the HDLC standard(s). It has been tested against HDLC protocol test equipment. I have adapted it to be most similar to Jan's code for the purpose of seeing how poorly the C version performs in comparison (28 cycles).
unsigned char CRCLo, CRCHi;

void CRCNib(unsigned char b)
{
    CRCLo ^= b;
    b      = CRCHi;
    CRCHi  = CRCLo ^ (CRCLo << 4);
    CRCLo  = b;
    CRCLo ^= (b = CRCHi >> 4);
    b      = CRCHi ^ (b >> 1);
    CRCLo ^= CRCHi << 3;
    CRCHi  = b;
}


List of 32 messages in thread
TopicAuthorDate
CRC16 CCITT - What a challenge!            01/01/70 00:00      
   Have you seen this?            01/01/70 00:00      
      Of course!            01/01/70 00:00      
         Balance            01/01/70 00:00      
            I know, Russ,            01/01/70 00:00      
         Code? What code?            01/01/70 00:00      
            in the code library - look to the left column            01/01/70 00:00      
               Thanks! I missed that note in the first post.            01/01/70 00:00      
   I need a hint            01/01/70 00:00      
      write down the bits            01/01/70 00:00      
         Thanks for the hint            01/01/70 00:00      
            Your observations plus a comparison in C            01/01/70 00:00      
               The rest of the story ...            01/01/70 00:00      
                  Compilers, but Keil C51 8.09 for the stated 28~            01/01/70 00:00      
                  and this processes only a nibble, isn't it...            01/01/70 00:00      
                     No, it process the entire byte.            01/01/70 00:00      
                        now it\'s my pencil time...            01/01/70 00:00      
                           FYFI            01/01/70 00:00      
                              Clarification re: 8-bit optimized term            01/01/70 00:00      
                              on optimisation            01/01/70 00:00      
                                 Jan's optimization            01/01/70 00:00      
                                    Re: on optimization            01/01/70 00:00      
                                       Can you please be more specific?            01/01/70 00:00      
                                          More specifically ...            01/01/70 00:00      
            and what            01/01/70 00:00      
               More on checksums            01/01/70 00:00      
   No reason to hide the excreted code            01/01/70 00:00      
      Excreted code needs context like any other code            01/01/70 00:00      
   One More Comment            01/01/70 00:00      
      ... and a marginal remark ...            01/01/70 00:00      
         Init all ones frequently specified            01/01/70 00:00      
   18 cycles            01/01/70 00:00      

Back to Subject List