GPT分区中使用的CRC32算法

来源:互联网 发布:二叉树前中后遍历算法 编辑:程序博客网 时间:2024/06/05 08:18
/* * A8h reflected is 15h, i.e. 10101000 <--> 00010101*/int reflect(int data, int len){int ref = 0;for (int i = 0; i < len; i++) {if (data & 0x1) {ref |= (1 << ((len - 1) - i));}data = (data >> 1);}return ref;}/** Function to calculate the CRC32*/unsigned int calculate_crc32(unsigned char *buffer, int len){int 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 (int i = 0; i < len; i++) {int data_byte = buffer[i];data_byte = reflect(data_byte, 8);for (int 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;}

原创粉丝点击