uriy 0 April 5 Posted April 5 · Report post Имеется полином, порождающая матрица и кусок кода. Часто вижу подобное в помехоустойчивых кодах, но не понимаю как из этой математики получать код. Для меня тут только понятно как получили данные в массиве. Почему 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); } Quote Share this post Link to post Share on other sites More sharing options...
x893 0 April 5 Posted April 5 · Report post х8+х5+х4+х3+1 = 100111001 = 471 (в восьмеричной) = 0х139 Quote Share this post Link to post Share on other sites More sharing options...
_4afc_ 1 April 5 Posted April 5 · Report post х8+х5+х4+х3+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 Quote Share this post Link to post Share on other sites More sharing options...
uriy 0 April 5 Posted April 5 · Report post ок, с этим разобрались. А код то как получили? Quote Share this post Link to post Share on other sites More sharing options...
Lmx2315 0 April 5 Posted April 5 · Report post Цитата Почему data проверяют побитно и причем тут операция исключающее или? http://kpe.hww.ru/ASM/Book/Charter9/1.htm на рисунке Рис. 9.4. Схема вычисления CRC-деления. Там представлена схема деления входного кода на полином чтобы получить остаток, так вот если приглядеться к процессу деления - то видно что его проделывают через "исключающее или" и посредством сдвига на 1 бит. Quote Share this post Link to post Share on other sites More sharing options...
MegaVolt 1 April 5 Posted April 5 · Report post 1 час назад, Lmx2315 сказал: Там представлена схема деления входного кода на полином чтобы получить остаток, так вот если приглядеться к процессу деления - то видно что его проделывают через "исключающее или" и посредством сдвига на 1 бит. Причём это самый медленный способ реализации. Далее идёт табличный который позволяет обрабатывать входящие данные не побитно а байтами и более. Плавный переход тут: https://xakep.ru/2004/03/30/21788/ Quote Share this post Link to post Share on other sites More sharing options...
Obam 0 April 5 Posted April 5 · Report post Классику, классику жанра забыли!!! Ross N. Williams http://ad-books.narod.ru/asm/articles/crc.pdf Чуть-чуть не 30 лет уж как... Quote Share this post Link to post Share on other sites More sharing options...
uriy 0 April 6 Posted April 6 · Report post Ключевая фраза в этих статьях - "Полиномиальная арифметика по модулю 2". Кое-что прояснилось. Но прочитав эти статьи мне все равно бы не удалось написать такой сишный код как в первом посте. Quote Share this post Link to post Share on other sites More sharing options...
Darth Vader 0 April 6 Posted April 6 · Report post 10 часов назад, uriy сказал: мне все равно бы не удалось написать такой сишный код как в первом посте. Этот код тоже не идеален. Там есть поле для рефакторинга. Если массив G[7] нигде больше не используется, то логично объявить его локально внутри функции с квалификатором static const. Quote Share this post Link to post Share on other sites More sharing options...