Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.66
body90
 Аватар для body90
360 / 293 / 8
Регистрация: 26.05.2009
Сообщений: 2,676
#1

Подсчитать CRC для файла - C++

29.12.2011, 22:32. Просмотров 5097. Ответов 9
Метки нет (Все метки)

Здравствуйте! Есть имя файла. Как для этого файла подсчитать CRC? Проблема не в понимании алгоритма, а в том, что на данном языке я не писал уже несколько лет. Помогите, пожалуйста, быстренько набросать код.

Добавлено через 14 минут
Неужели никто не знает?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
911 / 736 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
30.12.2011, 12:07     Подсчитать CRC для файла #2
Цитата Сообщение от body90 Посмотреть сообщение
Как для этого файла подсчитать CRC?
CRC16 или CRC32, алгоритмов контрольных сумм полно в нете.
Persk
Модератор
 Аватар для Persk
7259 / 3096 / 188
Регистрация: 25.10.2010
Сообщений: 12,442
30.12.2011, 12:32     Подсчитать CRC для файла #3
Год назад сдавал по информационной безопасности зачёт, было не что похожее.
Правда катит только в Билдере 6 корректно, в Борланде выдаёт только первые (или последние, не помню) 4 значения, в MS VS выкидывает ошибку при выводе на экран
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*Программа расчёта Crc32 для файлов.txt*/
#include <stdio.h>//необходимо для printf
#include <conio.h>//необходимо для getch
#include <string.h>//необходимо для strlen
#define FNAME "text.txt"//макрос(константа)
/*Описываем функцию расчёта Crc16 standart CCITT
с применением полинома 1021=x^16 + x^12 + x^5 + 1*/
unsigned short Crc16(unsigned char *buf, unsigned short len)
{
unsigned short crc = 0xFFFF;//переменная 16 бит = 2 байта
unsigned char i; //переменная 8 бит = 1 байт
while (len--)// проверка условия продолжения
{
crc ^= *buf++ << 8;
for (i = 0; i < 8; i++)//цикл перебора полинома
crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
}
return crc;//конец функции расчёта Crc16
}
 
/*Описываем функцию расчёта Crc32
с применением полинома EDB88320UL=
x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11
+ x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1*/
unsigned long Crc32(unsigned char *buf, unsigned long len)
{
//инициализируем таблицу расчёта Crc32
unsigned long crc_table[256];//массив 32 бита = 4 байтам
unsigned long crc;//переменная 32 бита = 4 байтам
for (int i = 0; i < 256; i++)//инициализируем цикл массива
{
crc = i;
for (int j = 0; j < 8; j++)//цикл перебора полинома
crc = crc & 1 ? (crc >> 1) ^ 0xEDB88320UL : crc >> 1;
crc_table[i] = crc;
};
crc = 0xFFFFFFFFUL;
while (len--)// проверка условия продолжения
crc = crc_table[(crc ^ *buf++) & 0xFF] ^ (crc >> 8);
return crc ^ 0xFFFFFFFFUL; //конец функции расчёта Crc32
};
 
/*Создаём файл text.txt для записи  и обработки*/
int main()
{
char c[50];//массив для вводимого текста
FILE *f = fopen("text.txt", "w");//Открыли файл text.txt для записи
FILE *fp = fopen("report.txt", "w");//Открыли файл report.txt для записи
if ((f = fopen("text.txt", "w"))==NULL)//Если файл невозможно открыть
{
printf ("\nError = Nevozmozchno otcrjt' fail\n");//то выдаём сообщение
getch(); //задерживаем программу
return 0;//выходим из программы
}
else //иначе
{//выдаём  следующие сообщения
printf("\nBuilder C++ 6\n");
printf("\nProgramma sostavlenija CRC-coda\n");
printf("\nVvedite english text ili tsifrj:\n");
scanf("%s",&c);//вводим текст
fprintf(f, "%s", c);//передаём введённый текст в файл text.txt
fclose(f); //Файл text.txt закрыли
}
if ((f = fopen("text.txt", "rt"))==NULL)//Если файл невозможно открыть
{
printf ("\nError = Nevozmozchno otcrjt' fail\n");//то выдаём сообщение
getch(); //задерживаем программу
return 0;//выходим из программы
}
else//иначе
unsigned long Crc32(unsigned char *buf, unsigned long len);
char buf[4096]; int len;
fgets(buf, sizeof(buf), f);
len = strlen(buf);
//Выводим на консоль имя файла и его CRC-16 и CRC-32
printf("\nCRC-16 standart CCITT(nex) faila %s  = %x\n",FNAME,Crc16(buf,len));
printf("\nCRC-32 standart IEEE 802.3 faila %s  = %p\n",FNAME,Crc32(buf,len));
//передаём выведенный текст в файл report.txt
fprintf(fp, "REPORT File %s", FNAME);
fprintf(fp, "\nCRC-16 standart CCITT(nex) = %x\n",Crc16(buf,len));
fprintf(fp, "CRC-32 standart IEEE 802.3 = %p\n",Crc32(buf,len));
fclose(f);//Файл text.txt закрыли
fclose(fp);//Файл report.txt закрыли
getch();  //задержка программы
return 0; //конец программы
}
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.12.2011, 12:34     Подсчитать CRC для файла #4
Вот это вроде работало: Получить хеш файла (CRC32, MD5, SHA1, TTH, ED2K, BitPrint, AICH....)
Sky_Walker
 Аватар для Sky_Walker
0 / 0 / 0
Регистрация: 05.05.2013
Сообщений: 4
08.01.2014, 22:14     Подсчитать CRC для файла #5
Persk, Здесь код, который работает только для одной строки. Как сделать так, чтобы он работал для всего файла????
body90
 Аватар для body90
360 / 293 / 8
Регистрация: 26.05.2009
Сообщений: 2,676
09.01.2014, 01:48  [ТС]     Подсчитать CRC для файла #6
Скорее всего, fgets в 73-й строке заменить на нужную Вам функцию чтения. На Си давно не писал. Точнее сразу подсказать не смогу.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,918
Записей в блоге: 17
09.01.2014, 01:53     Подсчитать CRC для файла #7
Есть в boost
gazlan
Нарушитель
3129 / 1904 / 285
Регистрация: 27.08.2010
Сообщений: 5,133
Записей в блоге: 1
09.01.2014, 06:58     Подсчитать CRC для файла #8
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#define BUF_SIZE           (4096)
 
static unsigned short pCRC16_Table[256];
static unsigned short wCRC16 = 0xFFFF;
 
static unsigned long pCRC32_Table[256];
static unsigned long dwCRC32;
 
 
/*Описываем функцию расчёта Crc16 standart CCITT
с применением полинома 1021=x^16 + x^12 + x^5 + 1*/
static void CRC16_Init()
{
   wCRC16 = 0xFFFF;
 
   for (int ii = 0; ii < 256; ++ii)
   {
      unsigned short    wCrc = ii << 8;
 
      for (int jj = 0; jj < 8; ++jj)
      {
         unsigned short    v = -((wCrc & 0x8000) != 0);
 
         wCrc <<= 1;
         wCrc  ^= v & 0x1021;
         wCrc  &= 0xFFFF;
      }
 
      pCRC16_Table[ii] = ((wCrc << 8) ^ (wCrc >> 8)) & 0xFFFF;
   }
}
 
static void CRC16_Update(unsigned char* pBuf,int iLen)
{ 
    unsigned i; unsigned crc = wCRC16;
 
    crc = 0xFFFF & ((crc>>8)^(crc <<8));
 
    for(i = 0; i < iLen; i++)
    {
        crc ^= pBuf[i];
        crc = (crc >> 8) ^ pCRC16_Table[crc & 0xFF];
    }
 
    wCRC16 = 0xFFFF & ((crc>>8)^(crc <<8));
}
 
static unsigned short CRC16_Finalize()
{
   return wCRC16;
}
 
/*Описываем функцию расчёта Crc32
с применением полинома EDB88320UL=
x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11
+ x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1*/
 
static void CRC32_Init()
{
   for (int ii = 0; ii < 256; ++ii)
   {
      dwCRC32 = ii;
 
      for (int jj = 0; jj < 8; ++jj)
      {
         dwCRC32 = (dwCRC32 & 1)  ?  (dwCRC32 >> 1) ^ 0xEDB88320  :  dwCRC32 >> 1;
      }
 
      pCRC32_Table[ii] = dwCRC32;
   }
 
   dwCRC32 = 0xFFFFFFFF;
}
   
static void CRC32_Update(unsigned char* pBuf,int iLen)
{
   while (iLen--)
   {
      dwCRC32 = pCRC32_Table[(dwCRC32 ^ *pBuf++) & 0xFF] ^ (dwCRC32 >> 8);
   }
}
 
static unsigned long CRC32_Finalize()
{   
   return dwCRC32 ^ 0xFFFFFFFF;
}
 
int main(int argc,char** argv)
{
   char  pBuf[BUF_SIZE]; 
   int   iLen = 0;
 
   if (argc < 2)
   {
      printf("\nError = No input file\n");
      return 0;
   }
 
   if (argc == 2)
   {
      if ((!strcmp(argv[1],"?")) || (!strcmp(argv[1],"/?")) || (!strcmp(argv[1],"-?")) || (!stricmp(argv[1],"/h")) || (!stricmp(argv[1],"-h")))
      {
         printf("\nUsage: crc.exe filename.ext\n");
         return 0;
      }
   }
 
   FILE*    pIn = fopen(argv[1],"rb");
   
   if (!pIn)
   {
      printf("\nError = Nevozmozchno otcrjt' fail\n");
      return 0;
   }
 
   printf("\nCRC calc\n");
 
   CRC16_Init();
   CRC32_Init();
 
   while (iLen = fread(pBuf,1,sizeof(pBuf),pIn))
   {
      CRC16_Update((unsigned char*)pBuf,iLen);
      CRC32_Update((unsigned char*)pBuf,iLen);
   }
 
   // Выводим на консоль имя файла и его CRC-16 и CRC-32
   printf("\nCRC-16 CCITT:      %04x\n",CRC16_Finalize());
   printf("\nCRC-32 IEEE 802.3: %08X\n",CRC32_Finalize());
 
   fclose(pIn);
 
   return 0;
}
Sky_Walker
 Аватар для Sky_Walker
0 / 0 / 0
Регистрация: 05.05.2013
Сообщений: 4
09.01.2014, 09:17     Подсчитать CRC для файла #9
Цитата Сообщение от Avazart Посмотреть сообщение
Есть в boost
Это библиотека для С++, мне же нужно реализовать в Борланде С.

Добавлено через 40 минут
Чем можно заменить 73 строку
C
1
fgets(buf, sizeof(buf), f);
,
чтобы обрабатывался весь файл?
Я пробывал объеденить все строки в одну, но это не помогло. Т.к. объединение строк приводит к изменению файла, и контрольная сумма неверная. Нужно учитывать знаки разрыва строки, пустые строки где то в начале или середине файла и т.д.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2014, 14:08     Подсчитать CRC для файла
Еще ссылки по теме:

C++ Подсчитать сколько раз встречается каждый байт файла
Наивный подход CRC-32 C++
Подсчитать количество символов в последнем слове файла C++
C++ Убрать реверс в CRC-алгоритме
C++ Подсчитать количество символов в каждой строке текстового файла

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

Или воспользуйтесь поиском по форуму:
vxg
Модератор
 Аватар для vxg
2858 / 1791 / 182
Регистрация: 13.01.2012
Сообщений: 6,767
09.01.2014, 14:08     Подсчитать CRC для файла #10
Цитата Сообщение от Sky_Walker Посмотреть сообщение
реализовать в Борланде С
вычисление контрольных сумм
lrc_modicon
lrc_icp_das
lrc_volmag
crc16_ibm
crc16_ccitt
Вложения
Тип файла: zip cs_test.zip (449.0 Кб, 76 просмотров)
Yandex
Объявления
09.01.2014, 14:08     Подсчитать CRC для файла
Ответ Создать тему
Опции темы

Текущее время: 10:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru