📄 crc32.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 + -