Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Nightwalker
4 / 4 / 2
Регистрация: 21.11.2014
Сообщений: 178
1

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

21.11.2014, 12:41. Просмотров 1249. Ответов 6
Метки нет (Все метки)

Здраствуйте дорогие программисты!!!! Вот в чём проблема!! Есть такая програмка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//---------------------------------------------------------------------------
#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 он кароче по длине и будет влезать на выводе в консоле))
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2014, 12:41
Ответы с готовыми решениями:

CRC-контрольная сумма отправляемого сообщения
Здравствуйте. У меня такая проблема: я не очень разбираюсь в программирование,...

Контрольная сумма участка кода в памяти
Нужно найти контрольную сумму блока кода прямо в памяти, я делаю это примерно...

Crc-32
Будьте добрый, поясните мне пример crc32 и википедии: #include &lt;stddef.h&gt;...

Расчет CRC
С Наступающим форумчане!!!) подскажите пожалуйста можно ли как-то расcчитать...

CRC-16 для файла
Есть код для подсчета crc16 (Modbus) для бинарного файла, если файл превышает...

6
schdub
Эксперт С++
3038 / 1380 / 421
Регистрация: 19.01.2009
Сообщений: 3,686
Завершенные тесты: 1
21.11.2014, 13:07 2
Лучший ответ Сообщение было отмечено schdub как решение

Решение

Nightwalker, вот пример расчета CRC32 для файла:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#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;
}
Bash
1
2
3
4
$ gcc -Wall a.c && ./a.out 
crc32 for '/home/jsbot/src/tmp/a.c' is 2fe16be5
$ crc32 /home/jsbot/src/tmp/a.c
2fe16be5
0
Nightwalker
4 / 4 / 2
Регистрация: 21.11.2014
Сообщений: 178
21.11.2014, 13:42  [ТС] 3
Спасибо!! но видишь в чём проблема тут надо задавать директорию!! а в моём случии путь это **.** тоесть где находится exe после компиляции те файлы с папки он и считывает,и в какую бы папку я не всунул бы exe-шник там он и считывает!!

Добавлено через 6 минут
Или если я чегото не понемаю помоги приспособить этот алгоритм к моей програме пожалуйста!!!
0
schdub
Эксперт С++
3038 / 1380 / 421
Регистрация: 19.01.2009
Сообщений: 3,686
Завершенные тесты: 1
21.11.2014, 14:10 4
Nightwalker, ну так в чем проблема? Вы не знаете как получить абсолютный путь к найденному файлу? Перед циклом получаете текущую директорию (_getcwd()), перед вызовом crc32_file() добавляете к пути директории имя файла (f.ff_name)

Добавлено через 19 минут
хотя, наверное, под Windows можно открывать из текущей папки по неабсолютному пути. Добавьте в строку 35:
C
1
printf("%08X", crc32_file(f.ff_name));
ну и скопируйте весь мой код до main() и вставьте перед функцией info().
0
Nightwalker
4 / 4 / 2
Регистрация: 21.11.2014
Сообщений: 178
21.11.2014, 14:31  [ТС] 5
Урааа заработала спасибо огромное,надо было сразу на f.ff_name использывать функцию а я блин заморачивался)))) Спасибо огромное очень момогли!!!!!

Добавлено через 6 минут
Извеняюсь за наглость есть есчо один маленький вопросик может всётаки есть решение этому,я уже всё перепробывал,в общем кокда считываю файлы из папки и вывожу на экран если на латинеце название файла то показывет без проблем,но если НАЗВАНИЕ файла руское то ироглифы,я подключал разные виды функции setLocale и так далее,главное простой printf показывает норм руский а если хочу откыть файл и если на русском то открывает но ироглифы а так русский видит норм!!
0
schdub
Эксперт С++
3038 / 1380 / 421
Регистрация: 19.01.2009
Сообщений: 3,686
Завершенные тесты: 1
21.11.2014, 14:49 6
Nightwalker, в строке 14 и 24 вместо ".866" впишите "Russian"

если не поможет попробуйте вместо вызова setlocale() использовать system("chcp 1251");
0
Nightwalker
4 / 4 / 2
Регистрация: 21.11.2014
Сообщений: 178
21.11.2014, 15:02  [ТС] 7
Это тоже пробывал,и некак,текст простой выводит нет проблем а как открыть файл с руским названием хоть ты тресни некак,либо ироглифы либо пустое место,тоесть если баловатся с 1251 ну и остальные такие способы,паходу консоль не хочет открывать файлы с руским именем,хотя страно веть из файла он считывает руский текст,выводит просто руский текст а вот файл показать норм не хочет(((
0
21.11.2014, 15:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2014, 15:02

Подсчет CRC заданной структуры
Добрый день, есть стандартная функция подсчета контрольной суммы (взято с...

Как получить md5 сумму
Доброго времени суток. Понимаю, что по теме сразу скажут, что надо гуглить, но...

Контрольная сумма(сумма цифр)
Помогите пожалуйста с такой задачей Акела постарел, стал слабее, и теперь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru