From 87fa30640fdd61502de4d51fff7b69671765c73a Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 28 May 2026 14:31:57 +0300 Subject: [PATCH] Init --- APP/main.c | 185 +++++++---------------------------------------------- 1 file changed, 23 insertions(+), 162 deletions(-) diff --git a/APP/main.c b/APP/main.c index a726750..f1d8cf4 100644 --- a/APP/main.c +++ b/APP/main.c @@ -230,15 +230,11 @@ uint32_t calculate_file_crc32_full(const char *filename, int verbose) { } /** - * @brief Записывает размер данных и CRC32 в файл - * Размер данных (file_size - 4) записывается по смещению 256 байт от конца файла - * CRC32 записывается в последние 4 байта файла + * @brief Записывает CRC32 в последние 4 байта файла */ int write_crc32_to_file(const char *filename, uint32_t crc_value, int verbose) { FILE *file = NULL; long file_size; - long data_size; - int result = 0; file = fopen(filename, "rb+"); if (file == NULL) { @@ -246,7 +242,6 @@ int write_crc32_to_file(const char *filename, uint32_t crc_value, int verbose) { return -1; } - // Получаем размер файла if (fseek(file, 0, SEEK_END) != 0) { perror("Failed to seek to end"); fclose(file); @@ -260,70 +255,11 @@ int write_crc32_to_file(const char *filename, uint32_t crc_value, int verbose) { return -1; } - data_size = file_size - 4; // Размер данных без CRC - - if (verbose) { - printf("File size: %ld bytes\n", file_size); - printf("Data size (without CRC): %ld bytes (0x%lX)\n", data_size, data_size); - printf("CRC value: 0x%08X (%u)\n", crc_value, crc_value); - } - - // ============================================== - // 1. Записываем размер данных по смещению 256 байт от конца файла - // ============================================== - long data_size_offset = file_size - 256; // Позиция для размера данных (ровно 256 байт от конца) - - // Проверяем, что позиция не отрицательная и не перекрывается с CRC - if (data_size_offset < 0) { - fprintf(stderr, "Warning: File too small, cannot write data size at offset 256 from end\n"); - fprintf(stderr, "File size: %ld bytes, need at least 256 bytes\n", file_size); - if (verbose) { - printf("Skipping data size write (file too small)\n"); - } - } else if (data_size_offset + 4 > file_size - 4) { - fprintf(stderr, "Warning: Data size position overlaps with CRC area\n"); - fprintf(stderr, "Data size would be at %ld, CRC at %ld\n", data_size_offset, file_size - 4); - if (verbose) { - printf("Skipping data size write (overlap detected)\n"); - } - } else { - // Перемещаемся на позицию для записи размера данных - if (fseek(file, data_size_offset, SEEK_SET) != 0) { - perror("Failed to seek to data size position"); - result = -1; - goto cleanup; - } - - // Записываем размер данных в little-endian порядке (4 байта для 32-битного размера) - uint8_t size_bytes[4]; - size_bytes[0] = (data_size >> 0) & 0xFF; - size_bytes[1] = (data_size >> 8) & 0xFF; - size_bytes[2] = (data_size >> 16) & 0xFF; - size_bytes[3] = (data_size >> 24) & 0xFF; - - size_t bytes_written = fwrite(size_bytes, 1, 4, file); - if (bytes_written != 4) { - fprintf(stderr, "Failed to write data size to file\n"); - result = -1; - goto cleanup; - } - - if (verbose) { - printf("\nData size written: %ld bytes (0x%lX)\n", data_size, data_size); - printf(" Position: %ld (0x%lX) bytes from start\n", data_size_offset, data_size_offset); - printf(" Distance from end: %ld bytes (exactly 256 bytes)\n", file_size - data_size_offset); - printf(" Bytes written (LE 32-bit): %02X %02X %02X %02X\n", - size_bytes[0], size_bytes[1], size_bytes[2], size_bytes[3]); - } - } - - // ============================================== - // 2. Записываем CRC в последние 4 байта файла - // ============================================== + // Перемещаемся на позицию последних 4 байт if (fseek(file, file_size - 4, SEEK_SET) != 0) { perror("Failed to seek to CRC position"); - result = -1; - goto cleanup; + fclose(file); + return -1; } // Записываем CRC в little-endian порядке @@ -336,34 +272,29 @@ int write_crc32_to_file(const char *filename, uint32_t crc_value, int verbose) { size_t bytes_written = fwrite(crc_bytes, 1, 4, file); if (bytes_written != 4) { fprintf(stderr, "Failed to write CRC to file\n"); - result = -1; - goto cleanup; + fclose(file); + return -1; } + fclose(file); + if (verbose) { - printf("\nCRC32 value written: 0x%08X (%u)\n", crc_value, crc_value); - printf(" Position: %ld-%ld (last 4 bytes)\n", file_size - 4, file_size - 1); - printf(" Bytes written (LE): %02X %02X %02X %02X\n", - crc_bytes[0], crc_bytes[1], crc_bytes[2], crc_bytes[3]); + printf("CRC32 value written: 0x%08X (%u)\n", crc_value, crc_value); + printf("Written to bytes: %ld-%ld (last 4 bytes)\n", file_size - 4, file_size - 1); printf("Byte order: little-endian (LSB first)\n"); } - cleanup: - fclose(file); - return result; + return 0; } /** * @brief Проверяет CRC32, сравнивая вычисленное значение с сохраненным - * Также опционально проверяет сохраненный размер данных */ int verify_crc32(const char *filename, int verbose) { FILE *file = NULL; long file_size; - long stored_data_size = 0; uint32_t calculated_crc = 0; uint32_t stored_crc = 0; - int verify_size = 1; // Флаг проверки размера file = fopen(filename, "rb"); if (file == NULL) { @@ -388,48 +319,7 @@ int verify_crc32(const char *filename, int verbose) { printf("File size: %ld bytes\n", file_size); } - // ============================================== - // 1. Читаем сохраненный размер данных (опционально) - // ============================================== - long data_size_offset = file_size - 256; // Позиция размера данных (256 байт от конца) - if (data_size_offset >= 0 && data_size_offset + 4 <= file_size - 4) { - if (fseek(file, data_size_offset, SEEK_SET) != 0) { - perror("Failed to seek to stored data size"); - verify_size = 0; - } else { - uint8_t size_bytes[4]; - size_t bytes_read = fread(size_bytes, 1, 4, file); - if (bytes_read == 4) { - stored_data_size = (long)size_bytes[0] << 0 | - (long)size_bytes[1] << 8 | - (long)size_bytes[2] << 16 | - (long)size_bytes[3] << 24; - - if (verbose) { - printf("\nStored data size: %ld bytes (0x%lX) at offset %ld\n", - stored_data_size, stored_data_size, data_size_offset); - printf(" Distance from end: %ld bytes (exactly 256 bytes)\n", file_size - data_size_offset); - printf(" Bytes read (LE 32-bit): %02X %02X %02X %02X\n", - size_bytes[0], size_bytes[1], size_bytes[2], size_bytes[3]); - } - } else { - verify_size = 0; - if (verbose) { - printf("Failed to read stored data size (expected 4 bytes, got %zu)\n", bytes_read); - } - } - } - } else { - verify_size = 0; - if (verbose) { - printf("\nNo valid data size stored at offset 256 bytes from end\n"); - printf(" File size: %ld, would need at least %ld bytes\n", file_size, 256 + 4); - } - } - - // ============================================== - // 2. Читаем сохраненный CRC из последних 4 байт - // ============================================== + // Читаем сохраненный CRC из последних 4 байт if (fseek(file, file_size - 4, SEEK_SET) != 0) { perror("Failed to seek to stored CRC"); fclose(file); @@ -458,48 +348,20 @@ int verify_crc32(const char *filename, int verbose) { return -1; } - long actual_data_size = file_size - 4; - // Всегда выводим значения CRC при проверке - printf("\n╔════════════════════════════════════════════════════════════╗\n"); - printf("║ CRC32 Verification ║\n"); - printf("╠════════════════════════════════════════════════════════════╣\n"); - printf("║ Stored CRC : 0x%08X (%10u) ║\n", stored_crc, stored_crc); - printf("║ Calculated CRC : 0x%08X (%10u) ║\n", calculated_crc, calculated_crc); + printf("\n╔════════════════════════════════════════╗\n"); + printf("║ CRC32 Verification ║\n"); + printf("╠════════════════════════════════════════╣\n"); + printf("║ Stored CRC : 0x%08X (%10u) ║\n", stored_crc, stored_crc); + printf("║ Calculated CRC : 0x%08X (%10u) ║\n", calculated_crc, calculated_crc); + printf("╚════════════════════════════════════════╝\n"); - if (verify_size && stored_data_size > 0) { - printf("╠════════════════════════════════════════════════════════════╣\n"); - printf("║ Stored data size : %12ld bytes (0x%lX) ║\n", stored_data_size, stored_data_size); - printf("║ Actual data size : %12ld bytes (0x%lX) ║\n", actual_data_size, actual_data_size); - } - - printf("╚════════════════════════════════════════════════════════════╝\n"); - - int crc_valid = (calculated_crc == stored_crc); - int size_valid = 1; - - if (verify_size && stored_data_size > 0) { - size_valid = (actual_data_size == stored_data_size); - } - - if (crc_valid && size_valid) { - printf("\n✓ VERIFIED: CRC matches and data size is correct! File integrity check passed.\n"); + if (calculated_crc == stored_crc) { + printf("\n✓ VERIFIED: CRC matches! File integrity check passed.\n"); return 0; - } else if (crc_valid && !size_valid) { - printf("\n⚠ WARNING: CRC matches but data size mismatch!\n"); - printf(" Stored size: %ld, Actual size: %ld, Difference: %ld\n", - stored_data_size, actual_data_size, actual_data_size - stored_data_size); - return 1; - } else if (!crc_valid && size_valid) { - printf("\n✗ MISMATCH: File is corrupted! CRC does not match (data size OK).\n"); - printf(" Difference: 0x%08X\n", calculated_crc ^ stored_crc); - return 1; } else { - printf("\n✗ MISMATCH: File is corrupted! Both CRC and data size are incorrect!\n"); - printf(" CRC difference: 0x%08X\n", calculated_crc ^ stored_crc); - if (verify_size && stored_data_size > 0) { - printf(" Size difference: %ld bytes\n", actual_data_size - stored_data_size); - } + printf("\n✗ MISMATCH: File is corrupted or CRC was not written correctly!\n"); + printf(" Difference: 0x%08X\n", calculated_crc ^ stored_crc); return 1; } } @@ -704,7 +566,6 @@ void print_usage(const char *program_name) { printf("\nNote:\n"); printf(" For -w and -c operations, CRC is calculated from the first\n"); printf(" (file_size - 4) bytes, ignoring the last 4 bytes.\n"); - printf(" Data size (file_size - 4) is written at offset 256 bytes from end.\n"); printf(" For split operation, offset can be specified in decimal or hex (0x prefix).\n"); printf(" If output filenames are not specified, default names will be used:\n"); printf(" _part1.bin and _part2.bin\n"); @@ -870,7 +731,7 @@ int main(int argc, char *argv[]) { printf("╚════════════════════════════════════════╝\n"); if (options.verbose) { - printf("\nStep 2: Writing CRC and data size to file...\n"); + printf("\nStep 2: Writing CRC to last 4 bytes...\n"); } result = write_crc32_to_file(options.filename, crc_value, options.verbose);