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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2010, 13:29   #1
Женя_88
Пользователь
 
Регистрация: 13.11.2010
Сообщений: 10
Вопрос подсчет CRC

Товарищи, кто-нибудь, объясните доходчи следующий кусок кода подсчета CRC IP заголовка???
Код:
unsigned short checksum(unsigned short* buffer,int size)
 {
 unsigned long cksum=0;
 while(size>1)
 {
  cksum+=*buffer++; //не могу логически понять эту строку, вроде как 
//  она должна подсчитывать  сумму заполненных полей IP заголовка?    
  size-=sizeof(unsigned short);  
  }
  if(size)
  cksum+=*(unsigned char*)buffer; //? в нете нашел объяснения, но все 
//равно не понимаю
  cksum=((cksum>>16)+cksum&0xffff);
  cksum+=(cksum>>16);
  return (unsigned short)(~cksum);
  }
Очень буду благодарен за помощь

Последний раз редактировалось Stilet; 16.11.2010 в 13:44.
Женя_88 вне форума Ответить с цитированием
Старый 16.11.2010, 14:23   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код:
cksum+=*buffer++; //не могу логически понять эту строку, вроде как 
//  она должна подсчитывать  сумму заполненных полей IP заголовка?
Что не понятного? К текущему значению КС прибавить слово, на которое указывает указатель, а после сдвинуть этот указатель на следущее слово.

Код:
if(size)
  cksum+=*(unsigned char*)buffer; //? в нете нашел объяснения, но все 
//равно не понимаю
Если размер оказался не кратен слову, то прибавляем в сумму последний байт.
p51x вне форума Ответить с цитированием
Старый 16.11.2010, 15:01   #3
Женя_88
Пользователь
 
Регистрация: 13.11.2010
Сообщений: 10
По умолчанию

У меня вопрос в другом
...
typedef struct IP_PR
{
unsigned int ip_srcaddr; //4 байта
unsigned int ip_dstaddr; //4 байта
unsigned char ip_opt; //1 байт
unsigned char ip_ttl; //1 байт
unsigned char ip_proto; //1 байт
unsigned short ip_chaecksum; //2 байта
unsigned short ip_id; ...
unsigned char ip_flags:3;
unsigned short ip_offset;
unsigned short ip_totallength;
unsigned char ip_tos;
unsigned char ip_hdlen;
unsigned char ip_version:4; //в сумме 184 Так?
}IP_HDR;
.....
int main()
{
....
checksum((USHORT*)&ip_head,sizeof(I P_PR));
....
}

unsigned short checksum(unsigned short* buffer,int size)
{
...
while(size>1)
{
cksum+=*buffer++;// при первом вызове здесь должна быть сумма всего
//заголовка?
cout<<"in WHILE cksum: "<<endl;// вроде сумма должна быть =184 ?
//почему когда я ввожу IP- адрес, допустим 192.1.1.1
//начальное значение *buffer получается равным 43200
size-=sizeof(unsigned short);
cout<<"in WHILE size: "<<size<<endl;

}
...
}

Последний раз редактировалось Женя_88; 16.11.2010 в 17:16.
Женя_88 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет CRC newcooller Помощь студентам 0 08.11.2010 15:58
Подсчет CRC-суммы файла на ассемблере.. Человек_Борща Общие вопросы Delphi 11 10.06.2010 20:06
Delphi. CRC-32 файла JemJoy Помощь студентам 0 25.03.2010 19:17
CRC ОШИБКА mikki1130 Софт 0 26.11.2009 18:42
Помогите с изменением CRC cyber_xz Помощь студентам 3 28.09.2009 17:24