Контрольная Сумма (CRC, MD5) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здраствуйте дорогие программисты!!!! Вот в чём проблема!! Есть такая програмка:
//---------------------------------------------------------------------------
#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();
}
//---------------------------------------------------------------------------
Она у меня работает на все 100%,так вот в чём проблема нужна сюда вставить функцию вычесления контрольной суммы Md5 или CRC и чтоб это выводилось в области кде написана контрольноя сумма!! Я видел и здесь и везде куча алгоритмов и так далее но суть в том что незнаю как подогнать под мою програму,и чтоб не как во всех алгоритмов вычесляет для одного файла толька,мне надо чтоб для всех файлов в папке,как афиширует моя програма всё содержимое папки и атрибуты каждого файла тоже самое надо с контрольной суммой,прошу очень впишите имено эту програму чтоб осушествить это вычесление!!!И чтоб всё остальное тоже работала!!! Спасибо за ранее!! (Желательно Crc32 он кароче по длине и будет влезать на выводе в консоле))

Решение задачи: «Контрольная Сумма (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;
}

Объяснение кода листинга программы

  1. В функции crc32_bitwise принимается на вход указатель на данные, их длина и предыдущее значение контрольной суммы CRC-32.
  2. Инициализируется переменная crc с предыдущим значением CRC-32, где знак ~ используется для инвертирования значения.
  3. Переменная current указывает на текущий байт данных.
  4. В цикле, пока есть данные, каждый байт XOR-ется с текущим значением CRC-32.
  5. Затем происходит сдвиг байта вправо на 1 бит и инвертирование результата.
  6. Полученное значение XOR-ется с текущим значением CRC-32.
  7. Процесс повторяется для каждого байта данных.
  8. В функции crc32_file открывается файл с помощью функции fopen и проверяется его успешное открытие.
  9. Если файл не может быть открыт, выводится сообщение об ошибке и возвращается 0.
  10. В противном случае, файл закрывается с помощью функции fclose.
  11. Затем в цикле считываются данные из файла до тех пор, пока они не закончатся.
  12. Каждый блок данных обрабатывается функцией crc32_bitwise.
  13. После окончания чтения файла, закрывается файл.
  14. Возвращается окончательное значение CRC-32.
  15. В функции main указывается путь к файлу для вычисления CRC-32.
  16. Вычисляется и выводится CRC-32 для указанного файла.
  17. Программа успешно завершается.

Оцени полезность:

12   голосов , оценка 3.917 из 5
Похожие ответы