Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2014, 13:50   #21
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

В общем, да) Тупой прямолинейный копипаст не канает. Обязательно надо в общих чертах представлять как работает.

Взял с алгоритм с вики и просто добавил main():
Код:
#include <fstream>
#include <iostream>
#include <string>
#include <locale>

using namespace std;

unsigned int CRC32_function(unsigned char *buf, unsigned long len)
{
	unsigned long crc_table[256];
	unsigned long crc;
	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. Достаточно вызвать эту функцию и указать имя файла, для которого будет произведён расчёт
unsigned int CRC32_count(char* filename){

//
	char buf[4096*64] ; //сколько символов в файле, на самом деле, это должно быть больше, 2^31-1 будет для файла размером 2ГБ
	ifstream f (filename,std::ios::binary);
	f.read(buf,4096*64);
	return CRC32_function((unsigned char*)buf, f.gcount());
}

int main(){
	char *f = "c:/55/1.txt";
	cout << hex << CRC32_count(f);
	getchar();
}
Результат программы и онлайн-калькуляторов CRC совпал. Но тут надо учесть, что тестировать лучше на цифрах или латинице, потому что кодировки.

Цитата:
И мне, что нужно побитно перемножить полином от key0=0x12345678 на значения полинома из таблицы?
Ага, побитно перемножить по основанию 2. Т.е., сделать ^ между значением из таблицы и текущим CRC.

Последний раз редактировалось Smogg; 12.12.2014 в 13:55.
Smogg вне форума Ответить с цитированием
Старый 12.12.2014, 15:17   #22
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
Ага, побитно перемножить по основанию 2. Т.е., сделать ^ между значением из таблицы и текущим CRC.
просто, коммент.
XOR (^) - это сложение mod 2, никак не умножение.
f.hump вне форума Ответить с цитированием
Старый 12.12.2014, 16:24   #23
vasanov
Пользователь
 
Регистрация: 07.12.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
...
Результат программы и онлайн-калькуляторов CRC совпал. Но тут надо учесть, что тестировать лучше на цифрах или латинице, потому что кодировки.
Да, спасибо, это хоть и на С++ ( мне одинаково, что Си, что С++ не знаю) но скомпилировалось, и посчитало CRC32. Попробую, все это для Си приспособить и как нибудь вставить это злосчастное pt, чтоб считался этот не менее злосчастный key0=сrc32(key0,pt). У меня всегда возникал вопрос куда прилеплять этот main(), ни в одних исходниках его не ставят, а компилятор всегда на него ругается. Теперь вижу, как main можно прилеплять, чтоб он все не испортил.
vasanov вне форума Ответить с цитированием
Старый 12.12.2014, 16:41   #24
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от vasanov Посмотреть сообщение
Да, спасибо, это хоть и на С++ ( мне одинаково, что Си, что С++ не знаю) но скомпилировалось, и посчитало CRC32. Попробую, все это для Си приспособить и как нибудь вставить это злосчастное pt, чтоб считался этот не менее злосчастный key0=сrc32(key0,pt). У меня всегда возникал вопрос куда прилеплять этот main(), ни в одних исходниках его не ставят, а компилятор всегда на него ругается. Теперь вижу, как main можно прилеплять, чтоб он все не испортил.
)) main - точка входа в программу. Именно здесь всегда начинается исполнение кода. И исполнение кода продолжается до тех пор, пока не случится return из этой самой, главной функции main.

В С здесь разве чтение из файла будет по другому, а в функции расчета ничего С++специфичного не вижу (разве что надо уточнить сколько байтов в unsigned long у вашего компилятора).

Последний раз редактировалось Smogg; 12.12.2014 в 16:50.
Smogg вне форума Ответить с цитированием
Старый 12.12.2014, 16:44   #25
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
просто, коммент.
XOR (^) - это сложение mod 2, никак не умножение.
да, дейсвитно.. 1 + 1 = 10, берем по модулю, получаем 0, а 1 * 1 = 1.
Smogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор message RuVarez Общие вопросы Delphi 0 14.05.2012 18:31
Разбор string vbutrim C# (си шарп) 5 11.04.2012 17:29
разбор строки D_e_n_n Помощь студентам 2 03.03.2011 15:22
Разбор кода. С++ TIT0 Помощь студентам 0 27.12.2010 11:17
разбор пути m_kostik Win Api 3 01.04.2010 22:25