Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> расчет CRC-16, помогите  
:(
    Опции темы
ds474
Дата 31.5.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 31.5.2007

Репутация: нет
Всего: нет



 Помогите с расчетом  crc-16. До этого ни разу не имел дело с этим.
Вот описание расчета КС:
Поле  контрольной  суммы  содержит  значение CRC-16 (Cyclic Redundancy Check). CRC-16  представляет собой 16-разрядный остаток от деления  сообщения (поля  адреса,  функции  и  данных),  предварительно умноженного  на  полином x^16  (сдвигом  на 16  бит  влево),  на  полином, выраженный двоичным числом 11000000000000101B. 

Вот пример для него(вроде праивльный...):
Сообщение: 03 03 02 01 01 
КС:01 D4

Я сам написал попробовал реализовать 
тот алгоритм,  но он не считает правильно :(
Код


void CRC(char *szStr, unsigned uLen)
{
    //char sets
    unsigned short CRC=0;
    for(int i=0;i<uLen;i++)
        CRC+=((szStr[i]<<16)%0x18005) ;
    char crc[2]={0,0};
     CRC&=0xFFFF;
    sprintf(crc,"%s",CRC);
    //printf("%x",CRC);
    strcat(szStr,crc);

}


жду помощи...

Это сообщение отредактировал(а) ds474 - 31.5.2007, 14:19
PM MAIL   Вверх
korbian
Дата 1.6.2007, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 2
Всего: 14



не все так просто, как вы изложили
См. atach.
и еще вот: fast crc


Присоединённый файл ( Кол-во скачиваний: 113 )
Присоединённый файл  crc16.zip 2,68 Kb


--------------------
korbian ©
PM   Вверх
ds474
Дата 1.6.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 31.5.2007

Репутация: нет
Всего: нет



Спасибо за ответ. Очень непростой алгоритм.
PM MAIL   Вверх
korbian
Дата 1.6.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 2
Всего: 14



пожалуйста.


--------------------
korbian ©
PM   Вверх
Artemon
Дата 2.6.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Что-то намудрили с CRC, все намного проще:
Код

#include <stdio.h>
//---------------------------------------------------------------------------
  class MY_CRC
{
  public:
        MY_CRC();
        unsigned short CRC(unsigned short crc, unsigned char ch);

        bool CrcIsCorrect(char* Data, int DataSize, unsigned short crc);
        
  private:
};


Код

#include "UMY_CRC.h"

//---------------------------------------------------------------------------
  MY_CRC::MY_CRC()
{
}
//---------------------------------------------------------------------------
  unsigned short MY_CRC::CRC(unsigned short crc, unsigned char ch)
{
        static const unsigned int crcPoly = 0x11021;

        int n;
        unsigned long m;

        m = ((unsigned long)crc << 8) | ch;
        for (n = 0; n < 8; n++)
                if ((m <<= 1) & 0x1000000)
                        m ^= ((unsigned int)crcPoly << 8);

        return (unsigned short)(m >> 8);
}
//---------------------------------------------------------------------------
  bool MY_CRC::CrcIsCorrect(char* Data, int DataSize, unsigned short crc)
{
  unsigned short tmpCRC = 0;

  if( !Data || !DataSize ) return false;

  for( int k = 0; k < DataSize; k++ )
     tmpCRC = CRC(tmpCRC, Data[k]);

  tmpCRC = CRC(tmpCRC, crc&0x00FF);
  tmpCRC = CRC(tmpCRC, crc>>8);

  //return tmpCRC == 0 ? true: false;
  return true;
}
//---------------------------------------------------------------------------



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
willhunting2
Дата 15.3.2010, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Почему-то
 Cannot open include file: 'UMY_CRC.h': No such file or directory
Error executing cl.exe.
PM MAIL   Вверх
GremlinProg
Дата 15.3.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106




M
GremlinProg
Тема перемещена из раздела C/C++: Системное программирование и WinAPI



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
chaos
Дата 16.3.2010, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Цитата(ds474 @  31.5.2007,  11:18 Найти цитируемый пост)
crc-16

Цитата(ds474 @  31.5.2007,  11:18 Найти цитируемый пост)
11000000000000101


или я чего-то упустил или хз, но не смущает ли вас полином? чот он не 16 битный.

по теме - не изобретать велосипед. "все уже украдено до вас" (с) boost::crc

Добавлено через 36 секунд
топикстартер мог бы не приводить набор 1 и 0, а дать полином в нормальнов виде в хексе
PM WWW   Вверх
EnergoHokum
Дата 19.3.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Код

typedef unsigned short crc16_type;
//--------------------------------------------------------------------------------
template <typename InputIterator>
crc16_type CRC16(InputIterator first,InputIterator last)
{
 crc16_type poly=0x1021;
 crc16_type crc16=0xFFFF;
 for(;first != last;++first)
 {
  crc16 ^= *first << 8;
  for(int i=0;i < 8;++i)
  { crc16=crc16 & 0x8000 ? (crc16 << 1) ^ poly : crc16 << 1; }
 }
 return crc16;
}

Я так сделал, на контрольной последовательности даёт верный результат.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.