这个什么算法,之前研究过,现在又给忘了,然后再去看,发现竟然看不懂了。
不管了,先记录代码的实现,后面再慢慢研究。
#include <stdio.h>
#include <string.h>
typedef unsigned int uint32_t;
typedef unsigned char uint8_t;
static int reflect(int data, int len)
{
int ref = 0;
int i;
for (i = 0; i < len; i++) {
if (data & 0x1) {
ref |= (1 << ((len - 1) - i));
}
data = (data >> 1);
}
return ref;
}
static uint32_t calculate_crc32(void *buf, uint32_t len)
{
uint32_t i, j;
uint32_t byte_length = 8; /*length of unit (i.e. byte) */
int msb = 0;
int polynomial = 0x04C11DB7; /* IEEE 32bit polynomial */
unsigned int regs = 0xFFFFFFFF; /* init to all ones */
int regs_mask = 0xFFFFFFFF; /* ensure only 32 bit answer */
int regs_msb = 0;
unsigned int reflected_regs;
for (i = 0; i < len; i++) {
int data_byte = *((uint8_t *)buf + i);
data_byte = reflect(data_byte, 8);
for (j = 0; j < byte_length; j++) {
msb = data_byte >> (byte_length - 1); /* get MSB */
msb &= 1; /* ensure just 1 bit */
regs_msb = (regs >> 31) & 1; /* MSB of regs */
regs = regs << 1; /* shift regs for CRC-CCITT */
if (regs_msb ^ msb) { /* MSB is a 1 */
regs = regs ^ polynomial; /* XOR with generator poly */
}
regs = regs & regs_mask; /* Mask off excess upper bits */
data_byte <<= 1; /* get to next bit */
}
}
regs = regs & regs_mask;
reflected_regs = reflect(regs, 32) ^ 0xFFFFFFFF;
return reflected_regs;
}
int main(int argc, char *argv[])
{
uint32_t ret = 0;
ret = calculate_crc32(argv[1], strlen(argv[1]));
printf("crc32:%x\n", ret);
return 0;
}