1、目的:C语言实现CRC32校验大文件
2、源码
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define BUFFER_SIZE 65536 // 64KB缓冲区优化读取效率
// 声明全局CRC表
uint32_t s_crc32table[256];
// 初始化CRC32表(标准IEEE-802.3多项式)
static void init_crc32_table(void) {
const uint32_t polynomial = 0xEDB88320;
for (uint32_t i = 0; i < 256; i++) {
uint32_t crc = i;
for (int j = 0; j < 8; j++) {
crc = (crc & 1) ? (crc >> 1) ^ polynomial : (crc >> 1);
}
s_crc32table[i] = crc;
}
}
// 主函数:计算文件CRC32
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s <filename>\n", argv[0]);
return 1;
}
// 初始化CRC表
init_crc32_table();
FILE *file = fopen(argv[1], "rb");
if (!file) {
perror("File open failed");
return 1;
}
// 获取文件大小
fseek(file, 0, SEEK_END);
size_t file_size = ftell(file);
fseek(file, 0, SEEK_SET);
printf("Calculating CRC32 for %ld MB file...\n", file_size / (1024 * 1024));
uint32_t crc = 0xFFFFFFFF; // 初始CRC值
char buffer[BUFFER_SIZE]; // 读缓冲区
// 逐块处理文件
while (!feof(file)) {
size_t bytes_read = fread(buffer, 1, BUFFER_SIZE, file);
if (ferror(file)) {
perror("File read error");
fclose(file);
return 1;
}
// 流式更新CRC值 (关键部分)
for (size_t i = 0; i < bytes_read; i++) {
uint8_t byte = buffer[i];
uint8_t idx = (crc ^ byte) & 0xff;
crc = s_crc32table[idx] ^ (crc >> 8);
}
}
fclose(file);
crc ^= 0xFFFFFFFF; // 最终异或
printf("CRC32: 0x%08X\n", crc);
return 0;
}
3150

被折叠的 条评论
为什么被折叠?



