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

Поиск:

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


Бывалый
*


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

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



Здравствуйте.
Подскажите кто знает алгоритм для следующей задачи.
Имеется дамп пакетов.
В конце каждого пакета CRC.
Используеться протакол HDLC,и соответственно по ITU-T в конце должна стоять CRC-16-CCITT    x16 + x12 + x5 + 1.
Для вычисления которой использовалась стандартная функция Qt QChecksum.

При работе с серией очередных дампов обнаружилось что crc не совпало ни разу на продолжении всего дампа...а это достаточно большое количество пакетов.
Собственно есть ли какой нибудь алгоритм в котором я могу самостоятельно задавать полиномы для crc,
и в пределах 16 бит осуществить перебор?

Заранее благодарен,
с уважением
RED HAWK.
--------------------
воин dzen'a
PM MAIL   Вверх
bsa
Дата 2.8.2011, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Процедура расчета CRC-16, взята из wiki
Код
/*
  Name  : CRC-16 CCITT
  Poly  : 0x1021    x^16 + x^12 + x^5 + 1
  Init  : 0xFFFF
  Revert: false
  XorOut: 0x0000
  Check : 0x29B1 ("123456789")
  MaxLen: 4095 байт (32767 бит) - обнаружение
    одинарных, двойных, тройных и всех нечетных ошибок
*/
unsigned short Crc16(unsigned char *pcBlock, unsigned short len)
{
    unsigned short crc = 0xFFFF; //начальное значение
    unsigned char i;
 
    while (len--)
    {
        crc ^= *pcBlock++ << 8;
 
        for (i = 0; i < 8; i++)
            crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1; //0x1021 - это полином x^12 + x^5 + x^0, 0x8000 - это  член x^16
    }
 
    return crc;
}

Обычно, меняют член x^5.
Видел полиномы: 0x1021, 0x1081, 0x1005
Очень часто меняют начальное значение на 0x0000.

Это сообщение отредактировал(а) bsa - 2.8.2011, 10:45
PM   Вверх
reider
Дата 30.6.2014, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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

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

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


 




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


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

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