Перейти к содержанию
    

Как из полинома получить сишный код

Имеется полином, порождающая матрица и кусок кода. 

Часто вижу подобное в помехоустойчивых кодах, но не понимаю как из этой математики получать код.

Для меня тут только понятно как получили данные в массиве.

Почему data проверяют побитно и причем тут операция исключающее или?

Что за результат полинома 471? Еще и в восьмеричной системе судя по всему. Как это учитывается в сишном коде?

unsigned int G[7] = {0x804f, 0x411e, 0x21b7, 0x11e2, 0x09c9, 0x04e5, 0x0273};

unsigned int Encode (unsigned int data)
{
    signed int i = 0;
    unsigned int checkbit = 0;

    for (i = 0; i < 7; i++)      
    {
        if (data & 0x8000)       
        {
            checkbit ^= G[i];      
        }
        data <<= 1;            
    }

    return (checkbit);
}

 

matrix.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

х8543+1 = 2^8+2^5+2^4+2^3+2^0 =  100000000+100000+10000+1000+1 = 100111001

 

из двоичной в восьмиричную переводят так: 100111001 = 100_111_001 = 471

 

из двоичной в шестнадцатиричную переводят так: 100111001 = 1_0011_1001 = 139

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата

Почему data проверяют побитно и причем тут операция исключающее или?

http://kpe.hww.ru/ASM/Book/Charter9/1.htm

на рисунке Рис. 9.4. Схема вычисления CRC-деления.

Там представлена схема деления входного кода на полином чтобы получить остаток, так вот если приглядеться к процессу деления - то видно что его проделывают через "исключающее или"  и посредством сдвига на 1 бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Lmx2315 сказал:

Там представлена схема деления входного кода на полином чтобы получить остаток, так вот если приглядеться к процессу деления - то видно что его проделывают через "исключающее или"  и посредством сдвига на 1 бит.

Причём это самый медленный способ реализации. Далее идёт табличный который позволяет обрабатывать входящие данные не побитно а байтами и более. Плавный переход тут:

 

https://xakep.ru/2004/03/30/21788/

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Классику, классику жанра забыли!!! Ross N. Williams
http://ad-books.narod.ru/asm/articles/crc.pdf
Чуть-чуть не 30 лет уж как...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ключевая фраза в этих статьях - "Полиномиальная арифметика по модулю 2". Кое-что прояснилось.

Но прочитав эти статьи мне все равно бы не удалось написать такой сишный код как в первом посте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, uriy сказал:

мне все равно бы не удалось написать такой сишный код как в первом посте.

Этот код тоже не идеален. Там есть поле для рефакторинга. Если массив G[7] нигде больше не используется, то логично объявить его локально внутри функции с квалификатором static const.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...