uint32_t reverse_32( uint32_t data )
{
  asm("rbit r0,r0");
  return data;
}
;

uint32_t crc32_ether( char *buf, int len, int clear )
{
  uint32_t *p = (uint32_t*) buf;
  uint32_t crc, crc_reg;
  if ( clear )
    CRC_ResetDR( );
  while ( len >= 4 )
  {
    crc_reg = CRC_CalcCRC( reverse_32( *p++ ) );
    len -= 4;
  }
  crc = reverse_32( crc_reg );
  if ( len )
  {
    CRC_CalcCRC( crc_reg );
    switch ( len )
    {
      case 1:
        crc_reg = CRC_CalcCRC( reverse_32( ( *p & 0xFF ) ^ crc ) >> 24 );
        crc = ( crc >> 8 ) ^ reverse_32( crc_reg );
        break;
      case 2:
        crc_reg = CRC_CalcCRC( reverse_32( ( *p & 0xFFFF ) ^ crc ) >> 16 );
        crc = ( crc >> 16 ) ^ reverse_32( crc_reg );
        break;
      case 3:
        crc_reg = CRC_CalcCRC( reverse_32( ( *p & 0xFFFFFF ) ^ crc ) >> 8 );
        crc = ( crc >> 24 ) ^ reverse_32( crc_reg );
        break;
    }
  }
  return ~crc;
}

 

相关文章:

  • 2022-12-23
  • 2022-03-11
  • 2022-12-23
  • 2021-09-15
  • 2022-12-23
  • 2021-11-07
  • 2021-10-08
猜你喜欢
  • 2022-01-02
  • 2021-11-12
  • 2021-09-12
  • 2022-02-14
  • 2021-08-02
  • 2021-11-08
相关资源
相似解决方案