Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/26: Рейтинг темы: голосов - 26, средняя оценка - 4.88
9 / 9 / 0
Регистрация: 14.08.2010
Сообщений: 148
1

Интересный пример для расчёта контрольной суммы.

05.10.2010, 19:14. Показов 5010. Ответов 24
Метки нет (Все метки)

Цитирую из http://rfc2.ru/1071.rfc
Приведенный ниже пример на языке C показывает расчет контрольной суммы с использованием внутреннего цикла сложения 16-битовых значений в 32-битовый «аккумулятор
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 in 6
    {
        /* Расчет контрольной суммы Internet для count байтов,
         * начиная с addr.
         */
     register long sum = 0;
 
     while( count > 1 )  {
        /*  Внутренний цикл */
            sum += * (unsigned short) addr++;
            count -= 2;
    }
 
        /*  Прибавляем байт переноса, если он есть */
    if( count > 0 )
            sum += * (unsigned char *) addr;
 
        /*  поместим 32-битовую сумму в 16 битов */
    while (sum>>16)
        sum = (sum & 0xffff) + (sum >> 16);
 
    checksum = ~sum;
}
но это ладно вроди надо обявить переменные которые выше не объявлены
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
#include "stdafx.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
register long sum = 0;
register long count = 0xfa55aa67;
     while( count > 1 )  {
        /*  Внутренний цикл */
            sum += * (unsigned short) addr++;
            count -= 2;
    }
 
        /*  Прибавляем байт переноса, если он есть */
    if( count > 0 )
            sum += * (unsigned char *) addr;
 
        /*  поместим 32-битовую сумму в 16 битов */
    while (sum>>16)
        sum = (sum & 0xffff) + (sum >> 16);
 
   register long checksum = ~sum;
 
    return 0;
}
может так но вот это как понять "* начиная с addr." начиная с какого addr и чем должна быть эта addr функцией, переменной?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2010, 19:14
Ответы с готовыми решениями:

Интересный пример оптимизации
Привет! Копаясь в OpenJDK наткнулся на довольно интересный подход (оптимизацию). Решил поделиться,...

Пример решения: подсчет контрольной суммы (Tribit)
Программа написана мной на C++ Builder 5.0. Полностью работоспособна, может кому пригодится. Ниже...

Составить программу для расчёта тангенса суммы
Помогите составить программу для расчёта тангенса суммы положительных элементов массива Z(m,n) и...

Структура пакета и расчет контрольной суммы для RS485
Стоит задача реализовать структуру (скелет) пакета для обмена по RS485. Master-орм выступает...

24
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
05.10.2010, 21:19 2
addr это переменная содержащая адрес заголовка пакета.
0
9 / 9 / 0
Регистрация: 14.08.2010
Сообщений: 148
05.10.2010, 21:25  [ТС] 3
А здесь целая реализация функции для расчёта CRC пакета представленного в hex виде
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
__u16 in_cksum ( __u16 *ptr, int nbytes )
 
{
 
    register __u32 sum;
 
    __u16 oddbyte;
 
    register __u16 answer;
 
 
 
    sum = 0;
 
    while ( nbytes > 1 ) {
 
           sum += *ptr ++;
 
           nbytes -= 2;
 
    }
 
 
 
    if ( nbytes == 1 ) {
 
           oddbytes = 0;
 
           * (( unsigned char *) &oddbyte ) = * (unsigned char *) ptr;
 
           sum += oddbyte;
 
    }
 
 
 
    sum = ( sum >> 16 ) + ( sum & 0xFFFF);
 
    sum += (sum >> 16 );
 
    answer=~sum;
 
    return (answer);
 
}
осталось только определить на какии переменные указывают слова "__u32, __u16"
0
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
05.10.2010, 21:40 4
__u32 это тип беззнаковый 32 бита, а __u16 беззнаковый 16 бит.
0
9 / 9 / 0
Регистрация: 14.08.2010
Сообщений: 148
05.10.2010, 21:46  [ТС] 5
ясно тип переменной unsigned int?
0
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
05.10.2010, 21:51 6
unsigned long (на 32 битных системах unsigned long и unsigned int одно и тоже).
0
9 / 9 / 0
Регистрация: 14.08.2010
Сообщений: 148
05.10.2010, 21:57  [ТС] 7
Вот разобрался рабочий скрипт но только пишит что в переменнй unsigned short ptr = 0xffaa44542ffddcadfd32556adaf; слишком большая константа "constant too big"
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
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
int main()
{
int sum, oddbyte;
short answer;
unsigned short ptr = 0xffaa44542ffddcadfd32556adaf;
int nbytes = 256;
 
    sum = 0;
 
    while ( nbytes > 1 ) {
 
           sum += ptr ++;
 
           nbytes -= 2;
 
    }
 
 
 
    if ( nbytes == 1 ) {
 
          int oddbytes = 0;
 
           * (( unsigned char *) &oddbyte ) = * (unsigned char *) ptr;
 
           sum += oddbyte;
 
    }
 
 
 
    sum = ( sum >> 16 ) + ( sum & 0xFFFF);
 
    sum += (sum >> 16 );
 
    answer=~sum;
cout << hex << answer;
    getch();
}
что можно сделать?
0
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
05.10.2010, 22:05 8
ptr должен быть указателем на USHORT, а не переменной содержащей значение USHORT.

Добавлено через 2 минуты
то есть:
BYTE data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
USHORT* ptr = (USHORT*)data;
0
9 / 9 / 0
Регистрация: 14.08.2010
Сообщений: 148
05.10.2010, 22:08  [ТС] 9
да теперь придётся поломать голову с массивом данных.
0
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
05.10.2010, 22:12 10
а что надо сделать?
0
9 / 9 / 0
Регистрация: 14.08.2010
Сообщений: 148
05.10.2010, 22:16  [ТС] 11
1 сформировать произвольный UDP пакет в виде hex кода, без поля данных.
2 расчитать его CRC.
3 отправить сформированный udp пакет в буфер сетевого устройства.
0
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
05.10.2010, 22:23 12
это просто, а что не получается?
0
9 / 9 / 0
Регистрация: 14.08.2010
Сообщений: 148
05.10.2010, 22:27  [ТС] 13
Для меня не просто я начал углублённо заниматься в C++ 4 месяца назад.
Пока я не могу првельно расчитать контрольные суммы.
0
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
05.10.2010, 23:06 14
Создай заголовок пакета (можно с данными) в виде массива, пробуй вычислять контрольную сумму и посылай пакет, перед этим установи сниффер и смотри что он показывает, там видно правильная она или нет, если не правильная, ищи что надо изменить в функции вычисления контрольной суммы.

Добавлено через 27 минут
А лучше так, отправь UDP пакет с помощью send и в сниффере посмотри правильную к. сумму, потом для этого же пакета пробуй вычислять её и сравнивай с правильной.
0
9 / 9 / 0
Регистрация: 14.08.2010
Сообщений: 148
06.10.2010, 17:42  [ТС] 15
Цитата Сообщение от Nwq Посмотреть сообщение
Создай заголовок пакета (можно с данными) в виде массива, пробуй вычислять контрольную сумму и посылай пакет, перед этим установи сниффер и смотри что он показывает, там видно правильная она или нет, если не правильная, ищи что надо изменить в функции вычисления контрольной суммы.

Добавлено через 27 минут
А лучше так, отправь UDP пакет с помощью send и в сниффере посмотри правильную к. сумму, потом для этого же пакета пробуй вычислять её и сравнивай с правильной.
Я уже этим занимаюся давно даже написал небольшой код для отправки пакетов в виде hex.
Вчера вот начал с контрольными суммами вроде алгоритм нашол рабочий.
Теперь надо производить расчёт CRC из массива как это сделать буду думать.
Пример
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
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
int main()
{
int sum, oddbyte;
short answer;
unsigned short ptr[2] = {0xffaa44542f, 0xdadaf446};
int nbytes = 256;
 
    sum = 0;
 
    while ( nbytes > 1 ) {
 
           sum += ptr ++;
 
           nbytes -= 2;
 
    }
 
 
 
    if ( nbytes == 1 ) {
 
          int oddbytes = 0;
 
           * (( unsigned char *) &oddbyte ) = * (unsigned char *) ptr;
 
           sum += oddbyte;
 
    }
 
 
 
    sum = ( sum >> 16 ) + ( sum & 0xFFFF);
 
    sum += (sum >> 16 );
 
    answer=~sum;
cout << hex << answer;
    getch();
}
не работает .
Такой прмер

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
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
int main()
{
int sum, oddbyte;
short answer;
unsigned short ptr = 0xffaa44542f;
int nbytes = 256;
 
    sum = 0;
 
    while ( nbytes > 1 ) {
 
           sum += ptr ++;
 
           nbytes -= 2;
 
    }
 
 
 
    if ( nbytes == 1 ) {
 
          int oddbytes = 0;
 
           * (( unsigned char *) &oddbyte ) = * (unsigned char *) ptr;
 
           sum += oddbyte;
 
    }
 
 
 
    sum = ( sum >> 16 ) + ( sum & 0xFFFF);
 
    sum += (sum >> 16 );
 
    answer=~sum;
cout << hex << answer;
    getch();
}
работает.
0
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
06.10.2010, 17:55 16
Оба примера с ошибками. Тебе надо сначало язык С научиться использовать, а потом начинать делать подобные вещи.
0
9 / 9 / 0
Регистрация: 14.08.2010
Сообщений: 148
06.10.2010, 17:58  [ТС] 17
Нет второй пример компилируется удачно и сумма выщитывается.
Только я её не проверял на правельность вычесления.
0
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
06.10.2010, 18:01 18
Во втором примере чушь полная.
0
9 / 9 / 0
Регистрация: 14.08.2010
Сообщений: 148
06.10.2010, 18:02  [ТС] 19
Всмысле ошибки при компиляции?
Или расчёт не верный.
0
33 / 33 / 2
Регистрация: 24.09.2010
Сообщений: 140
06.10.2010, 18:03 20
Сделай отдельную функцию и в неё передавай указатель на заголовок пакета.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2010, 18:03

Помощь в написании контрольных, курсовых и дипломных работ здесь.

БПФ для расчета контрольной суммы картинок и Java
Есть задача сравнивать картинки по контрольным суммам. Вычисление контрольной суммы труда не...

Расчет контрольной суммы для bluetooth ККМ CMP-10
Коллеги, помогите пожалуйста с расчетом контрольной суммы ККМ CMP-10 Дословно: Ума не...

Библиотека COMCRC.DLL для подсчета контрольной суммы
Библиотека COMCRC.DLL для подсчета контрольной суммы. Сопоставить CRCType = 1 одному из имен ...

Нужен алгоритм для вычисления контрольной суммы файлов crc64
Нужен алгоритм для вычисления контрольной суммы файлов crc64. Желательно на С++. А то везде CRC16...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.