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

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

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

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

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

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

Добавлено через 14 минут
Неужели никто не знает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2011, 22:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подсчитать CRC для файла (C++):

Как подсчитать CRC! - C++
Уважаемые Форумчане! Как подсчитать CRC. Есть файл чтения EEProm. - :10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 ...

Реализация crc - C++
Здравствуйте. Пытаюсь написать алгоритм Используя полимональную арифметику. Опишу алогритм как понимаю.. Считываю исходный ...

Алгоритм вычисления CRC-8 - C++
unsigned short crc8 (unsigned short *ptr, unsigned short size ) { unsigned short sum=0; while(size>0) { sum+=ptr; sum += (sum...

Наивный подход CRC-32 - C++
Объясните пожалуйста что делает каждая строчка функции в наивном подходе CRC-32. static uint32_t crc32_naive(uint8_t *buf) { ...

Расчет CRC-16 c Revert: true - C++
Добрый день. Прошу помочи с такой проблемой: сделал быстрый (т.е. с таблицей) расчет CRC для полинома 0х1021. Считает верно. Теперь...

Убрать реверс в CRC-алгоритме - C++
Господа, помогите ньюфагу. Нашел такую реализацию CRC32. Если проверить здесь www.zorc.breitbandkatze.de/crc.html, видно что она выдает...

9
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
30.12.2011, 12:07 #2
Цитата Сообщение от body90 Посмотреть сообщение
Как для этого файла подсчитать CRC?
CRC16 или CRC32, алгоритмов контрольных сумм полно в нете.
1
Persk
Модератор
Эксперт Windows
7382 / 3111 / 200
Регистрация: 25.10.2010
Сообщений: 12,889
30.12.2011, 12:32 #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; //конец программы
}
1
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.12.2011, 12:34 #4
Вот это вроде работало: Получить хеш файла (CRC32, MD5, SHA1, TTH, ED2K, BitPrint, AICH....)
1
Sky_Walker
0 / 0 / 0
Регистрация: 05.05.2013
Сообщений: 4
08.01.2014, 22:14 #5
Persk, Здесь код, который работает только для одной строки. Как сделать так, чтобы он работал для всего файла????
0
body90
364 / 297 / 8
Регистрация: 26.05.2009
Сообщений: 2,676
09.01.2014, 01:48  [ТС] #6
Скорее всего, fgets в 73-й строке заменить на нужную Вам функцию чтения. На Си давно не писал. Точнее сразу подсказать не смогу.
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,948
Записей в блоге: 17
09.01.2014, 01:53 #7
Есть в boost
0
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
09.01.2014, 06:58 #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;
}
0
Sky_Walker
0 / 0 / 0
Регистрация: 05.05.2013
Сообщений: 4
09.01.2014, 09:17 #9
Цитата Сообщение от Avazart Посмотреть сообщение
Есть в boost
Это библиотека для С++, мне же нужно реализовать в Борланде С.

Добавлено через 40 минут
Чем можно заменить 73 строку
C
1
fgets(buf, sizeof(buf), f);
,
чтобы обрабатывался весь файл?
Я пробывал объеденить все строки в одну, но это не помогло. Т.к. объединение строк приводит к изменению файла, и контрольная сумма неверная. Нужно учитывать знаки разрыва строки, пустые строки где то в начале или середине файла и т.д.
0
vxg
Модератор
3172 / 1975 / 222
Регистрация: 13.01.2012
Сообщений: 7,605
09.01.2014, 14:08 #10
Цитата Сообщение от Sky_Walker Посмотреть сообщение
реализовать в Борланде С
вычисление контрольных сумм
lrc_modicon
lrc_icp_das
lrc_volmag
crc16_ibm
crc16_ccitt
1
Вложения
Тип файла: zip cs_test.zip (449.0 Кб, 90 просмотров)
09.01.2014, 14:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2014, 14:08
Привет! Вот еще темы с ответами:

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

Подсчитать количество цифр из файла - C++
Здравствуйте, по заданию нужно подсчитать сколько раз встречается каждая цифра числа ПИ, которое находится в файла .txt и вывести на экран,...

Подсчитать количество символов в последнем слове файла - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cstring&gt; #include &lt;string&gt; using namespace std; int main() { int k=0,j=0; ...

Подсчитать количество символов в строках текстового файла - C++
подскажите, пожалуйста, как посчитать количество символов в строках текстового файла


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

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

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