⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc32.c

📁 CRC校验采用多项式编码方法。多项式乘除法运算过程与普通代数多项式的乘除法相同。多项式的加减法运算以2为模
💻 C
字号:
#include "digest.h"#include "crc32.h"static algo_t crc32 = {    CRC32_DIGEST_LENGTH,    sizeof(CRC32_CTX),    (hash_init_func_t)CRC32_Init,    (hash_update_func_t)CRC32_Update,    (hash_end_func_t)CRC32_End,    (hash_final_func_t)CRC32_Final,    (hash_equal_func_t)CRC32_Equal,};static unsigned long crc_table[256]; static void crc32_init(void)                /* build the crc table */{  unsigned long crc, poly;  int i, j;    poly = 0xEDB88320L;  for (i = 0; i < 256; i++)    {      crc = i;      for (j = 8; j > 0; j--)	{	  if (crc & 1)	    crc = (crc >> 1) ^ poly;	  else	    crc >>= 1;	}      crc_table[i] = crc;    }}voidCRC32_Init(CRC32_CTX *pms){    pms->count[0] = pms->count[1] = 0;    pms->state[0] = 0xFFFFFFFF;}voidCRC32_Update(CRC32_CTX *pms, const uint8_t *data, size_t nbytes){    register uint32_t crc = pms->state[0];    register const uint8_t *p = data;    uint32_t nbits = (uint32_t)(nbytes << 3);    if (nbytes <= 0)      return;    /* Update the message length. */    pms->count[1] += nbytes >> 29;    pms->count[0] += nbits;    if (pms->count[0] < nbits)      pms->count[1]++;    /* Update */    while (nbytes-- > 0)      crc = ((crc>>8) & 0x00FFFFFF) ^ crc_table[ (crc^(*p++)) & 0xFF ];        pms->state[0] = crc;}voidCRC32_Final(uint8_t *digest, CRC32_CTX *pms){  register uint32_t crc = pms->state[0] ^ 0xFFFFFFFF;  register int i;  for (i = 3; i >= 0; i--)     {      digest[i] = (uint8_t)(crc & 0xFF);      crc = crc >> 8;    }}voidCRC32_End(CRC32_CTX *pctx, uint8_t *hexdigest){  unsigned char digest[4];  size_t i;  CRC32_Final(digest, pctx);  for (i = 0; i < 4; i++)    sprintf(hexdigest + i * 2, "%02x", digest[i]);}int CRC32_Equal(CRC32_CTX* pctx1, CRC32_CTX* pctx2) {  return memcmp(pctx1->count, pctx2->count, sizeof(pctx1->count)) == 0    && memcmp(pctx1->state, pctx2->state, sizeof(pctx1->state)) == 0;}voidInit_crc32_in_c(){    VALUE mDigest, cDigest_Base, cDigest_CRC32;    crc32_init();    rb_require("digest.so");    mDigest = rb_path2class("Digest");    cDigest_Base = rb_path2class("Digest::Base");    cDigest_CRC32 = rb_define_class_under(mDigest, "CRC32InC", cDigest_Base);    rb_cvar_set(cDigest_CRC32, rb_intern("metadata"),		Data_Wrap_Struct(rb_cObject, 0, 0, &crc32), Qtrue);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -