1+ #include < stdio.h>
2+ #include < stdint.h>
3+ #include < stdlib.h>
4+ #include " crc32.h"
5+ #include " log.h"
6+
7+ // 静态成员初始化
8+ uint32_t CRC32::crc32_table[256 ];
9+ bool CRC32::table_initialized = false ;
10+
11+ // 初始化CRC32表
12+ void CRC32::initCRC32Table () {
13+ uint32_t c;
14+ for (int i = 0 ; i < 256 ; i++) {
15+ c = i;
16+ for (int j = 0 ; j < 8 ; j++) {
17+ c = (c & 1 ) ? (0xEDB88320 ^ (c >> 1 )) : (c >> 1 );
18+ }
19+ crc32_table[i] = c;
20+ }
21+ table_initialized = true ;
22+ }
23+
24+ // 获取文件大小,文件不存在返回-1
25+ size_t CRC32::getFileSize (const char * filename) {
26+ FILE* file = fopen (filename, " rb" );
27+ if (!file) {
28+ LOGE (" Failed to open file: %s" , filename);
29+ return -1 ; // 文件不存在
30+ }
31+
32+ fseek (file, 0 , SEEK_END);
33+ size_t size = ftell (file);
34+ fclose (file);
35+
36+ return size;
37+ }
38+
39+ // 计算文件的CRC32值
40+ uint32_t CRC32::calculateFileCRC32 (const char * filename) {
41+ if (!table_initialized) {
42+ initCRC32Table ();
43+ }
44+
45+ FILE* file = fopen (filename, " rb" );
46+ if (!file) {
47+ LOGE (" Failed to open file: %s" , filename);
48+ return 0 ;
49+ }
50+
51+ const size_t buffer_size = 8192 ; // 8KB缓冲区
52+ unsigned char * buffer = (unsigned char *)malloc (buffer_size);
53+ if (!buffer) {
54+ LOGE (" Failed to allocate memory for buffer" );
55+ fclose (file);
56+ return 0 ;
57+ }
58+
59+ uint32_t crc = 0xFFFFFFFF ;
60+ size_t bytes_read;
61+
62+ // 一次读取多个字节以提高性能
63+ while ((bytes_read = fread (buffer, 1 , buffer_size, file)) > 0 ) {
64+ for (size_t i = 0 ; i < bytes_read; i++) {
65+ crc = crc32_table[(crc ^ buffer[i]) & 0xFF ] ^ (crc >> 8 );
66+ }
67+ }
68+
69+ free (buffer);
70+ fclose (file);
71+ return crc ^ 0xFFFFFFFF ;
72+ }
73+
74+ // 验证文件CRC32是否匹配预期值
75+ bool CRC32::verifyFileCRC32 (const char * filename, uint32_t expected_crc) {
76+ uint32_t actual_crc = calculateFileCRC32 (filename);
77+ return (actual_crc == expected_crc);
78+ }
79+
80+ // 验证文件大小和CRC32是否匹配预期值
81+ bool CRC32::verifyFileSizeAndCRC32 (const char * filename, size_t expected_size, uint32_t expected_crc) {
82+ // 首先检查文件大小
83+ size_t actual_size = getFileSize (filename);
84+ if (actual_size == -1 ) {
85+ LOGE (" File does not exist: %s" , filename);
86+ return false ;
87+ }
88+
89+ if (actual_size != expected_size) {
90+ LOGE (" File size mismatch. Expected: %zu, Actual: %zu" , expected_size, actual_size);
91+ return false ;
92+ }
93+
94+ // 如果大小匹配,再检查CRC32
95+ uint32_t actual_crc = calculateFileCRC32 (filename);
96+ if (actual_crc != expected_crc) {
97+ LOGE (" CRC32 mismatch. Expected: 0x%08X, Actual: 0x%08X" , expected_crc, actual_crc);
98+ return false ;
99+ }
100+
101+ LOGI (" File verification passed: %s" , filename);
102+ return true ;
103+ }
0 commit comments