Контрольная Сумма (CRC, MD5) - C (СИ)
Формулировка задачи:
Здраствуйте дорогие программисты!!!! Вот в чём проблема!! Есть такая програмка:
Она у меня работает на все 100%,так вот в чём проблема нужна сюда вставить функцию вычесления контрольной суммы Md5 или CRC и чтоб это выводилось в области кде написана контрольноя сумма!! Я видел и здесь и везде куча алгоритмов и так далее но суть в том что незнаю как подогнать под мою програму,и чтоб не как во всех алгоритмов вычесляет для одного файла толька,мне надо чтоб для всех файлов в папке,как афиширует моя програма всё содержимое папки и атрибуты каждого файла тоже самое надо с контрольной суммой,прошу очень впишите имено эту програму чтоб осушествить это вычесление!!!И чтоб всё остальное тоже работала!!! Спасибо за ранее!! (Желательно Crc32 он кароче по длине и будет влезать на выводе в консоле))
//--------------------------------------------------------------------------- #pragma hdrstop #include <stdio.h> #include <dir.h> #include <conio.h> #include <windows.h> #include <locale> #include <iostream.h> #include <math.h> #include <string.h> #include <dos.h> void info(void) { setlocale (LC_ALL,".866"); wprintf(L" Soderjimoe kataloga: \n"); wprintf(L"|Imea.Rashirenia |Razmer faila |Data sozdania |Kontrolinaea summa|\n"); printf("|-----------------------|-------------------------|----------------------|-----------------|\n"); } void main() { clrscr(); struct ffblk f; int done; setlocale (LC_ALL,".866"); done = findfirst("**.**", &f, 0); system("mode con cols=126 lines=59"); info(); while (!done) { printf("|%-18s",f.ff_name); printf(" |%-6d",f.ff_fsize/1024); printf(" |%d:%d:%d %d/%d/%d.\n", f.ff_ftime>>11,(f.ff_ftime>>5) &0x3f, (f.ff_ftime<<1) &0x3f, f.ff_fdate &0x1f, (f.ff_fdate>>5) &0x0f,(f.ff_fdate>>9) + 1980); printf("|-----------------------|-------------------------|----------------------|-----------------|\n"); done = findnext(&f); } system("color F0"); getch(); } //---------------------------------------------------------------------------
Решение задачи: «Контрольная Сумма (CRC, MD5)»
textual
Листинг программы
#include <stdio.h> #include <stdint.h> uint32_t crc32_bitwise( const void* data, size_t length, uint32_t previousCrc32 ) { unsigned int j; uint32_t crc = ~previousCrc32; unsigned char* current = (unsigned char*) data; while (length--) { crc ^= *current++; for (j = 0; j < 8; j++) crc = ((crc & 1) ? (crc >> 1) ^ 0xEDB88320 : (crc >> 1)); } return ~crc; } uint32_t crc32_file(const char* filename) { FILE *file; int len; unsigned char buffer[1024] ; if ((file = fopen (filename, "rb")) == NULL) { printf("'%s' can't be opened\n", filename); return 0; } uint32_t crc32 = 0; while ((len = fread(buffer, 1, sizeof(buffer), file)) != 0) { crc32 = crc32_bitwise(buffer, len, crc32); } fclose(file); return crc32; } int main() { const char filePath[] = "/home/jsbot/src/tmp/a.c"; printf("crc32 for '%s' is %08x\n", filePath, crc32_file(filePath)); return 0; }
Объяснение кода листинга программы
- В функции
crc32_bitwise
принимается на вход указатель на данные, их длина и предыдущее значение контрольной суммы CRC-32. - Инициализируется переменная
crc
с предыдущим значением CRC-32, где знак~
используется для инвертирования значения. - Переменная
current
указывает на текущий байт данных. - В цикле, пока есть данные, каждый байт XOR-ется с текущим значением CRC-32.
- Затем происходит сдвиг байта вправо на 1 бит и инвертирование результата.
- Полученное значение XOR-ется с текущим значением CRC-32.
- Процесс повторяется для каждого байта данных.
- В функции
crc32_file
открывается файл с помощью функцииfopen
и проверяется его успешное открытие. - Если файл не может быть открыт, выводится сообщение об ошибке и возвращается 0.
- В противном случае, файл закрывается с помощью функции
fclose
. - Затем в цикле считываются данные из файла до тех пор, пока они не закончатся.
- Каждый блок данных обрабатывается функцией
crc32_bitwise
. - После окончания чтения файла, закрывается файл.
- Возвращается окончательное значение CRC-32.
- В функции
main
указывается путь к файлу для вычисления CRC-32. - Вычисляется и выводится CRC-32 для указанного файла.
- Программа успешно завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д