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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
max_1296
0 / 0 / 2
Регистрация: 19.08.2013
Сообщений: 74
#1

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

27.04.2016, 21:53. Просмотров 205. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2016, 21:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти crc16 для числа (C++):

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

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

Найти сумму первых 5 цифр дробной части действительного числа.например для числа 23,1680989 она равна 24.програма на С++ - C++
Найти сумму первых 5 цифр дробной части действительного числа.например для числа 23,1680989 она равна 24.Програма на С++.ПОЖАЛУЙСТА...

Найти сумму первых 5 цифр дробной части действительного числа.например для числа 23,1680989 она равна 24.Програма на С++ - C++
Найти сумму первых 5 цифр дробной части действительного числа.например для числа 23,1680989 она равна 24.Програма на С++.Нужна полная...

Вычисление CRC16 - C++
#include &lt;stddef.h&gt; #include &lt;stdint.h&gt; #include &lt;iostream&gt; #include &lt;process.h&gt; using namespace std; unsigned short...

CRC16, Unsigned Char и Полином - C++
CRC Verifying code #define UCHAR unsigned char #define UWORD unsigned int UWORD code CRC_TABLE={ ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nmcf
5319 / 4639 / 1551
Регистрация: 14.04.2014
Сообщений: 18,452
27.04.2016, 22:18 #2
А почему 128? Самый левый бит - 0x8000. И зачем эти очистки? Возьми сразу uint16_t.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2016, 22:18
Привет! Вот еще темы с ответами:

Найти квадрат (для целого) и куб (для вещественного числа) - C++
ПОМОГИТЕ ПОЖАЛУЙСТА РАЗОБРАТЬСЯ С КОДОМ, ТОЧНЕЕ С ФУНКЦИЕЙ,КОТОРАЯ ЭТО ВОЗВЕДЕНИЕ В КВАДРАТ ИЛИ КУБ ОСУЩЕСТВЛЯЕТ. Если мы вводим целое...

CRC16. Считать массив битов из файла - C++
Помогите пожалуйста: нужно что бы массив битов считывался из файла. Вот код: #include &lt;stddef.h&gt; #include &lt;stdint.h&gt; #include...

Дано натуральное число.Определить,сколько раз в нём встречается минимальная цифра(например, для числа 102200 ответ равен 3,для числа 40330-2,для числ - C++
Дано натуральное число.Определить,сколько раз в нём встречается минимальная цифра(например, для числа 102200 ответ равен 3,для числа...

Найти порядок n для целого числа k - C++
2. Найти порядок n для целого числа k &lt; {2}^{n} при помощи операций сдвига.


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru