Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.03.2011, 17:07
Новичок

Отправить личное сообщение для hypertonyc Посмотреть профиль Найти все сообщения от hypertonyc
 
Регистрация: 14.03.2011
Сообщений: 1

подобрать алгоритм расчета контрольной суммы
Существует клиент и сервер, которые обмениваются данными по сети. В конце каждого пакета имеется контр.сумма. Не располагаю описанием алгоритма её расчета, но есть необходимость его узнать. У меня есть список пакетов(около 260 тысяч штук).На основе анализа этих пакетов составил функцию, которая вычисляет эту сумму, но в некоторых пакетах она всё же не сходится(эти пакеты посылались на сервер еще несколько раз и в разном порядке и контрольная сумма в них действительно рассчитывается НЕ по моему алгоритму, так что это исключает возможность того что пакеты некорректны). Помогите пожалуйста.

результат программы 0.39% not good

списки пакетов:
http://rghost.ru/4766108 – все пакеты
http://rghost.ru/4766189 – результат программы(пакеты где контр.сумма рассчитана с ошибкой)

Код:
#include <stdio.h>

unsigned short calc_crc(unsigned char* bytes)
{
    unsigned short real_crc=0x0000;
    unsigned short tmp_crc=0x0000;
    for(int i=2;i<7;i++)
    {
        tmp_crc = (bytes[i])<<(6-i);
        real_crc=(real_crc + tmp_crc);		
    }

    while(real_crc>0xFF)
    {      
        real_crc = ((real_crc & 0xFF00)>>8) + (real_crc & 0x00FF);
    }
    
    return real_crc;
}
void main(void)
{
	unsigned char bytes[9];
	int number=0,all=0,bad=0;
	unsigned short __CRC;

	FILE *file = fopen("list.txt","r");
	FILE *file_res = fopen("list_res.txt","w+");
	while(!feof(file))
	{
		all++;
		fscanf(file,"%d %hx %hx %hx %hx %hx %hx %hx %hx %hx\n",&number,&bytes[0],&bytes[1],&bytes[2],&bytes[3],&bytes[4],&bytes[5],&bytes[6],&bytes[7],&bytes[8]);

		__CRC = calc_crc(bytes);		
		if(bytes[7] != __CRC)
		{
			bad++;
			fprintf(file_res,"%06d 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x : 0x%02x\n",bad,bytes[0],bytes[1],bytes[2],bytes[3],bytes[4],bytes[5],bytes[6],bytes[7],bytes[8],__CRC);
		}
	}
	printf("%03.2f%% not good\n",((float)bad/(float)all)*100.0);
	fclose(file_res);
	fclose(file);
	scanf("%d",&number);
}
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен алгоритм расчета шансов в покере DrewIt Работа 3 09.03.2010 17:20
Самый быстрый алгоритм вычисления корня из суммы квадратов Алексей1981 Математические алгоритмы (другое) 6 23.02.2010 02:54
Пожалуйста, помогите (алгоритм набора суммы) гость Графы 0 23.12.2009 12:14
Помогите подобрать топологию нейронной сети! гость Искусственный интеллект, нейронные сети 2 25.05.2009 03:18
Помагите написать алгоритм выплаты суммы денег... гость Задачи 1 22.10.2007 23:00