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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CRC, CRC 
:(
    Опции темы
hawk3500
Дата 17.6.2011, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте.
Подскажит кто знает, 
правильно ли я сделал алгоритм подсчёта CRC16.
Алгоритм предполагает универсальность-т.е.полином задаёт пользователь.

Код

INT16 CRC_16_table[256];


void CRC_16_create_table(INT64 Polinom)
{
    int r;
    for(int i=0;i<256;i++)
    {
        r=((int)i)<<8;
        for(byte j=0;j<8;j++)
        {
            if(r&(1<<15))r=(r<<1)^Polinom;
            else r=r<<1;
        }
        CRC_16_table[i]=r;
    }
}

INT16 GetCRC_16(byte *buf, int len)
{
    INT8 crc;
    crc = 0xFFFF;
    while(len--)
    {
        crc = CRC_16_table[((crc>>8)^*buf++)&0xFF] ^ (crc<<8);
    }
    crc ^= 0xFFFF;
    return crc;
}


Т.е. для полинома x16 + x15 + x2 + 1,надо будет сделать:
CRC_16_create_table(0x8005);
Зарранее благодарен,
с уважением Hawk.

Это сообщение отредактировал(а) hawk3500 - 17.6.2011, 19:33
--------------------
воин dzen'a
PM MAIL   Вверх
fish9370
Дата 17.6.2011, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а что такое полином? это математический термин?

как я понимаю CRC16 - это подсчет контрольной суммы, 16-разрядных слов

как например вычисление контрольной суммы IP заголовка:

Код

unsigned short in_cksum(unsigned short *addr, int len)
{
  unsigned short result;
  unsigned int sum = 0;

  /* складываем все двухбайтовые слова */
  while (len > 1) {
    sum += *addr++;
    len -= 2;
  }

  /* если остался лишний байт, добавляем его */
  if (len == 1)
    sum += *(unsigned char*) addr;

  sum = (sum >> 16) + (sum & 0xFFFF); /* добавляем перенос */
  sum += (sum >> 16);               /* еще раз */
  result = ~sum;                    /* инвертируем результат (сумма в обратном коде) */
  return result;
}



и что это у тебя за такие типы данных? 
они несколько нестандартные..


Это сообщение отредактировал(а) fish9370 - 17.6.2011, 21:17


--------------------
undefined
PM MAIL WWW ICQ   Вверх
bsa
Дата 17.6.2011, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



hawk3500, то, что ты сделал - это не функция расчет CRC, а функция генерация таблицы для расчета CRC.
Вот здесь, есть специализированные функции. Тебе необходимо сделать проверочную функцию, и протестировать свою на разных полиномах и наборе случайных чисел.
PM   Вверх
hawk3500
Дата 17.6.2011, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



 GetCRC_16 это для получения уже crc.
bsa подскажите пожалуйста, а функция расчёта таблицы верная?
Да на википедии я смотрел, но универсальности там нет...
--------------------
воин dzen'a
PM MAIL   Вверх
afiskon
Дата 18.6.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



PM MAIL WWW   Вверх
hawk3500
Дата 18.6.2011, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



....я в посте уже писал что в википедии я смотрел smile 

А вот правильно ли сделан приведённый выше алгоритм.....вот не знаю.
Хотелось бы услышать ответ именно на этот вопрос.
--------------------
воин dzen'a
PM MAIL   Вверх
bsa
Дата 19.6.2011, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



hawk3500, возьми проверь на случайных данных.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1818 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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