Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/39: Рейтинг темы: голосов - 39, средняя оценка - 4.62
body90
366 / 299 / 18
Регистрация: 26.05.2009
Сообщений: 2,676
#1

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

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

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

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

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

Реализация crc
Здравствуйте. Пытаюсь написать алгоритм Используя полимональную арифметику. ...

CRC Checksum 8 bit
Нужна простая консольная программа, которая при перетаскивании файла на неё...

Наивный подход CRC-32
Объясните пожалуйста что делает каждая строчка функции в наивном подходе...

Алгоритм вычисления CRC-8
unsigned short crc8 (unsigned short *ptr, unsigned short size ) { unsigned...

9
xAtom
918 / 743 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
30.12.2011, 12:07 #2
Цитата Сообщение от body90 Посмотреть сообщение
Как для этого файла подсчитать CRC?
CRC16 или CRC32, алгоритмов контрольных сумм полно в нете.
1
Persk
Модератор
Эксперт Windows
7460 / 3190 / 221
Регистрация: 25.10.2010
Сообщений: 13,121
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
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.12.2011, 12:34 #4
Вот это вроде работало: http://www.cyberforum.ru/post972225.html
1
Sky_Walker
0 / 0 / 0
Регистрация: 05.05.2013
Сообщений: 4
08.01.2014, 22:14 #5
Persk, Здесь код, который работает только для одной строки. Как сделать так, чтобы он работал для всего файла????
0
body90
366 / 299 / 18
Регистрация: 26.05.2009
Сообщений: 2,676
09.01.2014, 01:48  [ТС] #6
Скорее всего, fgets в 73-й строке заменить на нужную Вам функцию чтения. На Си давно не писал. Точнее сразу подсказать не смогу.
0
Avazart
Эксперт С++
7717 / 5626 / 549
Регистрация: 10.12.2010
Сообщений: 25,328
Записей в блоге: 17
09.01.2014, 01:53 #7
Есть в boost
0
gazlan
3139 / 1915 / 311
Регистрация: 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
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
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 Кб, 101 просмотров)
09.01.2014, 14:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2014, 14:08

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

Подсчитать количество цифр из файла
Здравствуйте, по заданию нужно подсчитать сколько раз встречается каждая цифра...

Убрать реверс в CRC-алгоритме
Господа, помогите ньюфагу. Нашел такую реализацию CRC32. Если проверить здесь...


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

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

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