Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/86: Рейтинг темы: голосов - 86, средняя оценка - 4.51
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696

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

29.12.2011, 22:32. Показов 18756. Ответов 19
Метки нет (Все метки)

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

Добавлено через 14 минут
Неужели никто не знает?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2011, 22:32
Ответы с готовыми решениями:

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

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

Посчитать crc файла
Процедура высчитывает crc файла, помогите это код перевести в VB. Ну не понимаю я в синтаксисе С. :) BYTE* bytes = new BYTE; ...

19
 Аватар для xAtom
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
30.12.2011, 12:07
Цитата Сообщение от body90 Посмотреть сообщение
Как для этого файла подсчитать CRC?
CRC16 или CRC32, алгоритмов контрольных сумм полно в нете.
1
Модератор
Эксперт Windows
 Аватар для Persk
8746 / 3371 / 244
Регистрация: 25.10.2010
Сообщений: 13,603
30.12.2011, 12:32
Год назад сдавал по информационной безопасности зачёт, было нечто похожее.
Правда катит только в Билдере 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
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
30.12.2011, 12:34
Вот это вроде работало: https://www.cyberforum.ru/post972225.html
1
 Аватар для Sky_Walker
0 / 0 / 0
Регистрация: 05.05.2013
Сообщений: 4
08.01.2014, 22:14
Persk, Здесь код, который работает только для одной строки. Как сделать так, чтобы он работал для всего файла????
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
09.01.2014, 01:48  [ТС]
Скорее всего, fgets в 73-й строке заменить на нужную Вам функцию чтения. На Си давно не писал. Точнее сразу подсказать не смогу.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.01.2014, 01:53
Есть в boost
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
09.01.2014, 06:58
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
Цитата Сообщение от Avazart Посмотреть сообщение
Есть в boost
Это библиотека для С++, мне же нужно реализовать в Борланде С.

Добавлено через 40 минут
Чем можно заменить 73 строку
C
1
fgets(buf, sizeof(buf), f);
,
чтобы обрабатывался весь файл?
Я пробывал объеденить все строки в одну, но это не помогло. Т.к. объединение строк приводит к изменению файла, и контрольная сумма неверная. Нужно учитывать знаки разрыва строки, пустые строки где то в начале или середине файла и т.д.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
09.01.2014, 14:08
Цитата Сообщение от Sky_Walker Посмотреть сообщение
реализовать в Борланде С
вычисление контрольных сумм
lrc_modicon
lrc_icp_das
lrc_volmag
crc16_ibm
crc16_ccitt
Вложения
Тип файла: zip cs_test.zip (449.0 Кб, 129 просмотров)
1
5 / 5 / 3
Регистрация: 17.11.2014
Сообщений: 67
18.10.2024, 13:59
gazlan, ваш код работает, но long я бы заменил на int везде.
Code
1
static unsigned long dwCRC32;
Output on CentOS 7 x64:
sizeof(long) = 8
0
Злостный нарушитель
 Аватар для Verevkin
10242 / 5670 / 1260
Регистрация: 12.03.2015
Сообщений: 26,265
18.10.2024, 17:43
Цитата Сообщение от timm_s Посмотреть сообщение
sizeof(long) = 8
10 лет назад long занимал 4 байта.
Не то, что щас! Эх, молодость...
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
18.10.2024, 19:12
Во это да,Verevkin, объявился.
0
Злостный нарушитель
 Аватар для Verevkin
10242 / 5670 / 1260
Регистрация: 12.03.2015
Сообщений: 26,265
18.10.2024, 20:31
Цитата Сообщение от повар1 Посмотреть сообщение
Во это да,Verevkin, объявился.
Это временно.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6136 / 2830 / 1039
Регистрация: 01.06.2021
Сообщений: 10,323
18.10.2024, 20:38
Цитата Сообщение от Verevkin Посмотреть сообщение
Это временно.
Да тут все временно. Байт это доказал.
0
Злостный нарушитель
 Аватар для Verevkin
10242 / 5670 / 1260
Регистрация: 12.03.2015
Сообщений: 26,265
18.10.2024, 20:41
Цитата Сообщение от Royal_X Посмотреть сообщение
Да тут все временно. Байт это доказал.
Я не это имел в виду, но тож сойдёт.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6136 / 2830 / 1039
Регистрация: 01.06.2021
Сообщений: 10,323
18.10.2024, 20:41
Цитата Сообщение от Verevkin Посмотреть сообщение
10 лет назад long занимал 4 байта.
Не то, что щас!
так и сейчас занимает у многих. На винде 4, а это самая популярная десктопная ОС.

Как видно на картинке, только на Unix-подобных 8, и то не на всех
0
Злостный нарушитель
 Аватар для Verevkin
10242 / 5670 / 1260
Регистрация: 12.03.2015
Сообщений: 26,265
18.10.2024, 20:49
Цитата Сообщение от Royal_X Посмотреть сообщение
так и сейчас занимает у многих
Тебе виднее, я не шарю в этом. С++ мне не родной язык.



0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6136 / 2830 / 1039
Регистрация: 01.06.2021
Сообщений: 10,323
18.10.2024, 20:54
Verevkin, ну значит этот онлайн компилятор на unix подобной системе работает
0
Злостный нарушитель
 Аватар для Verevkin
10242 / 5670 / 1260
Регистрация: 12.03.2015
Сообщений: 26,265
18.10.2024, 20:57
Цитата Сообщение от Royal_X Посмотреть сообщение
ну значит этот онлайн компилятор на unix подобной системе работает
Это факт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2024, 20:57
Помогаю со студенческими работами здесь

CRC error на чтение файла из флешки
Купил новую USB флешку 3 месяца назад OCZ Diesel 8 гигабайт. Поработала она у меня, теперь когда копирую большую массу файлов с флешки...

Расчет Контрольной суммы CRC части файла
имеем файл OSC_13.nbf первые 42 байта - это заголовок, где описано, для какого устройства, какая версия и какой язык в прошивке. ...

Как подсчитать MD5 для каждой строки файла?
string lines = File.ReadAllLines(@&quot;C:/Users/Addff/Desktop/text.txt&quot;); System.Security.Cryptography.MD5CryptoServiceProvider md5 = new...

Что такое CRC ? И для чего его юзать?
Привет! Я сделал поиск по гуглу и немного узнал о CRC: что это, мол, контрольная сумма... МОЙ ВОПРОС: можно ли это понимать как...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru