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

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

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

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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
30.12.2011, 12:07     Подсчитать CRC для файла #2
Цитата Сообщение от body90 Посмотреть сообщение
Как для этого файла подсчитать CRC?
CRC16 или CRC32, алгоритмов контрольных сумм полно в нете.
Persk
Модератор
7313 / 3150 / 191
Регистрация: 25.10.2010
Сообщений: 12,650
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
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.12.2011, 12:34     Подсчитать CRC для файла #4
Вот это вроде работало: Получить хеш файла (CRC32, MD5, SHA1, TTH, ED2K, BitPrint, AICH....)
Sky_Walker
0 / 0 / 0
Регистрация: 05.05.2013
Сообщений: 4
08.01.2014, 22:14     Подсчитать CRC для файла #5
Persk, Здесь код, который работает только для одной строки. Как сделать так, чтобы он работал для всего файла????
body90
360 / 293 / 8
Регистрация: 26.05.2009
Сообщений: 2,676
09.01.2014, 01:48  [ТС]     Подсчитать CRC для файла #6
Скорее всего, fgets в 73-й строке заменить на нужную Вам функцию чтения. На Си давно не писал. Точнее сразу подсказать не смогу.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,283
Записей в блоге: 17
09.01.2014, 01:53     Подсчитать CRC для файла #7
Есть в boost
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 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
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++
мне нужно на СИ: Дан текстовый файл, состоящий из одной или нескольких строк. Каждая тсрока файла содержит числа, разделенные пробелами....

Подсчитать количество символов в последнем слове файла - 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++
Прога открывает любой файл, в нем считывает общее количество байт. А далее начинается самое интересное, нужно организовать подсчет частоты...

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

Подсчитать количество букв русского алфавита из файла .txt - C++
Задача: Осуществить подсчет количества разных букв русского алфавита (&quot;а&quot;, &quot;б&quot;, ...) в текстовом файле .txt. Результаты вывести в...


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

Или воспользуйтесь поиском по форуму:
vxg
Модератор
3118 / 1920 / 208
Регистрация: 13.01.2012
Сообщений: 7,350
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 Кб, 84 просмотров)
Yandex
Объявления
09.01.2014, 14:08     Подсчитать CRC для файла
Ответ Создать тему
Опции темы

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