Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
2 / 2 / 3
Регистрация: 19.08.2013
Сообщений: 100

Найти crc16 для числа

27.04.2016, 21:53. Показов 2418. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый вечер, стоит следующая задача:
CRC-16.
Образующий полином: x16 + x15 + x2 + 1
Вводится исходное сообщение М (произвольное десятичное число). Переводится в
двоичный формат. Кодируется.
Случайным образом допускается от 0 до 2 ошибок, декодируется с обнаружением
ошибки.

пытался реализовать по этому описанию алгоритма:
Простой алгоритм расчёта CRC выполняется следующим образом:
1. В регистр CRC заносится начальное значение FFFFh.
2. В конец сообщения добавляется W нулевых битов
3. Содержимое регистра сдвигается влево на 1 бит, и в последнюю (нулевую) позицию заносится очередной, ещё не обработанный бит данных.
4. Если из регистра был выдвинут бит со значением "1", то содержимое регистра комбинируется по XOR с полиномом. Если значение бита равно "0", XOR не выполняется.
5. Шаги 3 и 4 выполняются, пока не будут обработаны все данные.
6. Окончательное содержимое регистра комбинируется по XOR со значением FFFFh.

функция которая у меня получилась(работает неправильно)
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
int reg = 0xFFFF;
int pole = 0x8005; //x16 + x15 + x2 + 1
 
int crc(int m)
{
m = m << 16;//не знаю как добавить 16 нулей, нужна 6байтная int, просто сдвигаю чтобы работало для маленьких чисел
    for (int i = 0; i < 32; i++) //
    {
        if (reg & 128)
        {
            reg = reg << 1;
            reg = reg & 0x0000FFFF;//выкидываю все что вылезло за два байта, не знаю надо это или нет
            reg += (m & 128)>>31;
            m = m << 1;         
            reg = reg ^ pole;
        }else
            {
            reg = reg << 1;
            reg = reg & 0x0000FFFF;
            reg +=( m & 128)>>31;
            m = m << 1;         
            }
        }
    reg = reg ^ 0xFFFF;
    return(reg);    
}
помогите поправить код, и натолкните на мысль реализации вот этой части- Случайным образом допускается от 0 до 2 ошибок, декодируется с обнаружением

Добавлено через 1 час 14 минут
немного поработал над кодом, пришел к выводу что вот так лучше, но выдает всегда один и тот же результат что при 0 что при большом числе
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
int reg = 0xFFFF;
int pole = 0x8005; //x16 + x15 + x2 + 1
int crc(int m)
{
 
    m = m << 16;
    for (int i = 0; i < 32; i++)
    {
        if (reg && 128)
        {
            reg = reg << 1;
            reg = reg && 0x0000FFFF;
            reg += m >>31;
            m = m << 1;
            reg = reg ^ pole;
        }else
            {
            reg = reg << 1;
            reg = reg && 0x0000FFFF;
            reg += m >>31;
            m = m << 1;
            }
        }
    reg = reg ^ 0xFFFF;
    return(reg);    
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.04.2016, 21:53
Ответы с готовыми решениями:

Подсчет crc16 для битовой последовательности
Здравствуйте! Мне нужно сделать подсчет crc суммы для блока двоичных данных с заранее известной длиной. Я нашел на вики данную функцию...

Для каждого числа найти корень квадратный, если дробная часть меньше 5, в противном случае найти квадрат данного числа
Даны три положительные действительные числа. Для каждого числа найти корень квадратный, если дробная часть меньше 5, в противном случае...

Расчет CRC16 для Modbus
Здравствуйте. Пишу расчет CRC16 для Modbus по описанию: http://piclist.ru/S-CRC16-RUS/CRC16.html 1. В регистр CRC заносится начальное...

1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.04.2016, 22:18
А почему 128? Самый левый бит - 0x8000. И зачем эти очистки? Возьми сразу uint16_t.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.04.2016, 22:18
Помогаю со студенческими работами здесь

Проблема с подсчетом CRC16 для Modbus
Доброго времени суток всем! Делаю небольшой проект с использованием протокола Modbus RTU, используя контроллер ATmega16 и AVR Studyo. В...

Полином для расчёта crc16 udp пакета
Подскажите может кто знает какой полином используется для расчёта crc16 udp пакета.

Для натурального числа N найти все взаимно простые для него числа в диапазоне [a, b]
Для натурального числа N найти все взаимно простые для него числа в диапазоне , где a, b∈ N, a&lt;b. Написать подпрограмму для...

Даны 3 числа. Для каждого из этих чисел, найти сумму цифр числа и определить у кокого числа сумма больше
Даны 3 числа. Для каждого из этих чисел, найти сумму цифр числа и определить у кокого числа сумма больше

CRC16
Здравствуйте. На данном сайте есть программа расчёта CRC16, в которой используется таблица. А как эта таблица считается вручную? Например...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru