Форум программистов, компьютерный форум CyberForum.ru

Найти crc16 для числа - C++

Восстановить пароль Регистрация
 
max_1296
0 / 0 / 2
Регистрация: 19.08.2013
Сообщений: 61
27.04.2016, 21:53     Найти crc16 для числа #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);    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2016, 21:53     Найти crc16 для числа
Посмотрите здесь:

C++ Для числа найти сумму с обратным по записи числом
C++ Найти порядок n для целого числа k
CRC16, Unsigned Char и Полином C++
C++ Вычисление CRC16
C++ Найти день недели для введенного числа месяца
CRC16. Считать массив битов из файла C++
C++ Для целого числа найти сумму нечетных цифр
C++ Найти квадрат (для целого) и куб (для вещественного числа)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4278 / 3709 / 1247
Регистрация: 14.04.2014
Сообщений: 14,503
27.04.2016, 22:18     Найти crc16 для числа #2
А почему 128? Самый левый бит - 0x8000. И зачем эти очистки? Возьми сразу uint16_t.
Yandex
Объявления
27.04.2016, 22:18     Найти crc16 для числа
Ответ Создать тему
Опции темы

Текущее время: 09:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru