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

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

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2011, 11:33   #1
hypertonyc
 
Регистрация: 13.03.2011
Сообщений: 5
По умолчанию подобрать алгоритм расчета контрольной суммы

Здравствуйте.
Имеются клиент и сервер которые обмениваются данными по сети. На каждый пакет клиента сервер отвечает пакетом данных по 9 байт. Первые два и последний во всех пакетах одинаковые. Предпоследний - это контрольная сумма вычисленная по 3ему,4,5,6, и 7му байтам. Собственно в этом и проблема, никак не пойму алгоритма расчета. Очень прошу гляньте свежим взглядом, боюсь ответ на поверхности просто у меня "инерция мышления" уже.
Прилагаю исходник моей небольшой программки(C++), в которой присутствует моя функция по расчеты к.суммы. Программка Считывает байты из текстового фала №1, рассчитывает по ним к.сумму и сравнивает с к.суммой из этого же файла. Если не совпадает, то записывает в текстовый файл №2.
Текстовый файл №1 это пакеты полученный с реального(работающего) сервера этой системы.

Код:
#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+=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;
	unsigned short __CRC;
	FILE *file = fopen("list.txt","r");
	FILE *file_res = fopen("list_res.txt","w+");
	while(!feof(file))
	{
		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)
		{
			fprintf(file_res,"%d %hx %hx %hx %hx %hx %hx %hx %hx %hx : error CRC = %hx \r\n",number,bytes[0],bytes[1],bytes[2],bytes[3],bytes[4],
bytes[5],bytes[6],bytes[7],bytes[8],__CRC);
		}
	}
	printf("eof\n");
	fclose(file_res);
	fclose(file);
	scanf("%d",&number);
}
http://ifolder.ru/22372832 - Текстовый файл №1(*.zip)
http://ifolder.ru/22372843 - Текстовый файл №2(*.zip)

Последний раз редактировалось Stilet; 13.03.2011 в 12:47.
hypertonyc вне форума Ответить с цитированием
Старый 13.03.2011, 12:49   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А если использовать функцию Win API CheckSumMappedFile?
Или программа не под винду?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.03.2011, 13:28   #3
hypertonyc
 
Регистрация: 13.03.2011
Сообщений: 5
По умолчанию

Наверное я не так изложил задачу.
Имеется работающая клиент-серверная система. Я не имею доступа к исходникам сервера и не располагаю каким-либо описанием протокола обмена между сервером и клиентом. У меня есть клиенты от этой системы и я пишу свой сервер самостоятельно. И застрял на проблеме с контрольной суммой. Неизвестно как она рассчитывается на сервере и проверяется в клиентах, но посылая пакеты на реальный сервер я получил около 260 тысяч ответов и выследил закономерность и составил свою функцию приведенную в исходнике. При расчете к.суммы с помощью моей функции и проверке с реальной суммой полученной с сервера в примерно 90% случаев всё верно, но есть пакеты в которых моя функция считает неправильно. Эти пакеты находятся в текстовом файле №2. Я прошу чтоб вы провели небольшой анализ и помогли мне составить алгоритм, с которым бы рассчитанная к.сумма во всех случаях совпадала с суммой рассчитанной на реальном сервере.
P.S. пакеты из текстового файла №2 посылались на сервер еще несколько раз и в разном порядке и контрольная сумма в них действительно рассчитывается НЕ по моему алгоритму, так что это исключает возможность того что пакеты некорректны.

Последний раз редактировалось hypertonyc; 13.03.2011 в 15:17.
hypertonyc вне форума Ответить с цитированием
Старый 13.03.2011, 14:43   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А ты всетки попробуй функцию мною указанную. Вдруг это действительно CRC32.
Кстати у меня с iFolder не качает...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.03.2011, 15:09   #5
hypertonyc
 
Регистрация: 13.03.2011
Сообщений: 5
По умолчанию

А. так это CRC32. я пробовал CRC8,CRC16 и CRC32 и первым делом это не оно. Если бы вы посмотрели пакеты то стало бы ясно. Сейчас перезалью куда-нибудь.
hypertonyc вне форума Ответить с цитированием
Старый 13.03.2011, 15:12   #6
hypertonyc
 
Регистрация: 13.03.2011
Сообщений: 5
По умолчанию

№1 - http://depositfiles.com/files/7y4siwyel
№2 - http://depositfiles.com/files/2trs78hac
hypertonyc вне форума Ответить с цитированием
Старый 14.03.2011, 08:29   #7
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Используй rghost.ru или habreffect.ru, у них там и скорость закачивания повыше, и рекламы нету. По теме не помогу.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 14.03.2011, 09:15   #8
hypertonyc
 
Регистрация: 13.03.2011
Сообщений: 5
По умолчанию

Спасибо, учту. Мне б по теме помощи.
hypertonyc вне форума Ответить с цитированием
Старый 02.12.2012, 22:41   #9
Iva-sist29
 
Регистрация: 02.12.2012
Сообщений: 6
По умолчанию

Проблема решена? А то, мне интересно стало а тексты уже не доступны.
Iva-sist29 вне форума Ответить с цитированием
Старый 03.12.2012, 22:26   #10
Iva-sist29
 
Регистрация: 02.12.2012
Сообщений: 6
По умолчанию

Проблема, очевидно в формуле: real_crc = ((real_crc & 0xFF00)>>8) + (real_crc & 0x00FF).
Если real_crc - WORD, то: 0x0002 > 00+02 = 02, и 0x0101 > 01+01 = 02 и т.д.
Iva-sist29 вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рекурсия для расчета суммы mego4el Помощь студентам 2 13.02.2011 10:02
Интересный пример для расчёта контрольной суммы. ATAMAN200 Общие вопросы C/C++ 0 05.10.2010 19:17
Нужно вычислить алгоритм подсчета контрольной суммы строки Walter Reed Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 30.01.2010 19:53
Алгоритм вычисления контрольной суммы файлов young_W Общие вопросы Delphi 2 11.09.2007 22:22