1. Си / Говнокод #23566

    −2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    #define POLY 0x8408
    /*
    //                                      16   12   5
    // this is the CCITT CRC 16 polynomial X  + X  + X  + 1.
    // This works out to be 0x1021, but the way the algorithm works
    // lets us use 0x8408 (the reverse of the bit pattern).  The high
    // bit is always assumed to be set, thus we only use 16 bits to
    // represent the 17 bit value.
    */
    
    unsigned short crc16(unsigned char *data_p, size_t length)
    {
      unsigned char i;
      unsigned int data;
    
      if ( length == 0 ) return 0;
      unsigned int crc = 0xFFFF;
      do
      {
        data = *data_p++;
        for ( i=0; i < 8; i++ )
        {
          if ( (crc ^ data) & 1 )
            crc = (crc >> 1) ^ POLY;
          else
            crc >>= 1;
          data >>= 1;
        }
      } while ( --length != 0 );
    
      crc = ~crc;
      data = crc;
      crc = (crc << 8) | ((data >> 8) & 0xff);
      return (unsigned short)(crc);
    }

    Типичный пример непортабельной хуйни на Си.

    Запостил: j123123, 07 Декабря 2017

    Комментарии (6) RSS

    • crc = ~crc;
      data = crc;
      crc = (crc << 8) | ((data >> 8) & 0xff);
      return (unsigned short)(crc);

      А зачем вообще так сложно? Нет чтоб
      crc = ~crc;
      return (unsigned short)((crc << 8) | ((сrc >> 8) & 0xff));

      Да и никакого & 0xFF тут не надо, если мы предполагаем что там оно 32-битное и unsigned
      Ответить
    • Use the lookup tables, Luke.

      static const uint16_t crctable[256] = {
          ...
      };
      
      uint16_t crc16(uint16_t crc, const void *buf, size_t len)
      {
          const uint8_t *c = buf;
      
          while (len--)
              crc = (crc << 8) ^ crctable[((crc >> 8) ^ *c++)];
      
          return crc;
      }


      Нагло спиженно с stack overflow и отформаченно как надо.
      Ответить
      • А crctable, естественно, сгенерировать в compile-time при помощи шаблонов.
        Ответить

    Добавить комментарий