реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Деление в алгоритме CRC
Костян
сообщение Sep 7 2012, 11:59
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



Итак дано:
CRC-5 x^5+x^2+1
Исходные данные: 0xD1

Из определения, CRC есть остаток от деления данных на полином. Значит CRC = 0xD1 % (x^5+x^2+1)

Делю в столбик
CODE
11010001
100101
--------
100010
100101
------------
      1111

остаток 1111 = 0xF


Проверяю онлайн калькулятором
http://ghsi.de/CRC/index.php?Polynom=100101&Message=B1
ответ
0x16 (hexadecimal)
10110 (binary)


В чем ошибка ? В онлайн калькуляторе судя по приведенным ими листингам кода начальное значение CRC равно 0
Go to the top of the page
 
+Quote Post
blackfin
сообщение Sep 7 2012, 12:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Костян @ Sep 7 2012, 15:59) *
Итак дано:
CRC-5 x^5+x^2+1
Исходные данные: 0xB1
Делю в столбик
Код
11010001
100101
--------
100010
100101
------------
      1111

В чем ошибка ?

0xB1 = 10110001, а у Вас делимое: 0xD1 = 11010001
Go to the top of the page
 
+Quote Post
Костян
сообщение Sep 7 2012, 12:23
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



QUOTE (blackfin @ Sep 7 2012, 10:19) *
0xB1 = 10110001, а у Вас делимое: 0xD1 = 11010001

упс rolleyes.gif описался, 0xD1 конечно. но в делении столбиком и ответ в онлайн калькуляторе я записал для 0xD1.
Go to the top of the page
 
+Quote Post
blackfin
сообщение Sep 7 2012, 12:49
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(Костян @ Sep 7 2012, 16:23) *
упс rolleyes.gif описался, 0xD1 конечно. но в делении столбиком и ответ в онлайн калькуляторе я записал для 0xD1.

Вот так ещё забавнее: http://ghsi.de/CRC/index.php?Polynom=100101&Message=1
Go to the top of the page
 
+Quote Post
Костян
сообщение Sep 7 2012, 13:06
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



QUOTE (blackfin @ Sep 7 2012, 10:49) *
Вот так ещё забавнее: http://ghsi.de/CRC/index.php?Polynom=100101&Message=1

аппаратный вычислитель crc дает такое же значение , что и этот онлайн по выше приведенной ссылке
http://www.easics.com/webtools/crctool
:-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 7 2012, 13:10
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Костян @ Sep 7 2012, 14:59) *
В чем ошибка ?
В том, что деление полиномов и деление чисел - несколько разные операции. Деление чисел выполняется сдвигом и вычитанием, деление полиномов - сдвигом и вычитанием по модулю 2, которое идентично сложению по модулю 2 (оно же "Исключающее ИЛИ", XOR). Поэтому формула CRC = 0xD1 % (x^5+x^2+1) не верна. Это первое.
Второе: перед делением полиномов делимое сдвигается влево на кол-во разрядов делителя.
И тогда все сходится:
CODE
11010001000000
100101
--------
100010
100101
    111100
    100101
     110010
     100101
      101110
      100101
        10110


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Костян
сообщение Sep 7 2012, 13:51
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



QUOTE
Поэтому формула CRC = 0xD1 % (x^5+x^2+1) не верна. Это первое.

согласен

QUOTE (Сергей Борщ @ Sep 7 2012, 11:10) *
Второе: перед делением полиномов делимое сдвигается влево на кол-во разрядов делителя.

Спасибо, разобрался beer.gif . Только сдвиг идет не на кол-во разрядов делителя, а на степень полинома, что меньше на 1 сдвиг. В Вашем делении в столбик последний 0 лишний. И этот сдвиг идет только при вычислении CRC.
Классическая схема деления полиномов не предполагает сдвига, если я все правильно понимаю.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 7 2012, 14:07
Сообщение #8


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



На самом деле это называется умножением в поле Галуа sm.gif
А вычисляется сдвигом и сложением по модулю 2 (XOR)

Простейший "аналоговый" кодер/декодер циклических кодов - это сдвиговый регистр с обратными связями, которые "приксориваются" в разрядах, соответствующих образующему полиному.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
blackfin
сообщение Sep 7 2012, 14:16
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(MrYuran @ Sep 7 2012, 18:07) *
На самом деле это называется умножением в поле Галуа sm.gif

Что называется "умножением в поле Галуа"? Деление по модулю на простой многочлен так называется?

Сообщение отредактировал blackfin - Sep 7 2012, 14:22
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 7 2012, 14:35
Сообщение #10


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(blackfin @ Sep 7 2012, 18:16) *
Что называется "умножением в поле Галуа"? Деление по модулю на простой многочлен так называется?

В данном случае - да.
Причем, и кодирование (умножение) и декодирования (как бы деление) производится одинаково.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Костян
сообщение Sep 7 2012, 14:38
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



QUOTE (MrYuran @ Sep 7 2012, 12:07) *
На самом деле это называется умножением в поле Галуа sm.gif
А вычисляется сдвигом и сложением по модулю 2 (XOR)

не совсем. Операция нахождения CRC - есть деление на многочлен в поле Галуа. Откуда взялось умножение то ?
А при кодирование и декодировании выполняется только операция деления (при кодировании находится остаток от деления, при декодировании идет проверка, что остаток равен нулю)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 7 2012, 14:54
Сообщение #12


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Костян @ Sep 7 2012, 18:38) *
не совсем. Операция нахождения CRC - есть деление на многочлен в поле Галуа. Откуда взялось умножение то ?
А при кодирование и декодировании выполняется только операция деления (при кодировании находится остаток от деления, при декодировании идет проверка, что остаток равен нулю)

Ну это смотря с какой стороны зайти.
Ну да ладно, пусть будет деление.

А я попутно интересную статью нагуглил, очень может пригодиться.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Костян
сообщение Sep 10 2012, 07:32
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



QUOTE (MrYuran @ Sep 7 2012, 12:54) *
А я попутно интересную статью нагуглил, очень может пригодиться.

это обшеизвестно, что crc не противостоит взлому, достаточно только ход байтов переставить и получим тот же CRC
Go to the top of the page
 
+Quote Post
i-mir
сообщение Sep 13 2012, 11:51
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 17-06-10
Из: Киев
Пользователь №: 57 986



К сожалению проблемы с пониманием CRC возникают благодаря некорректному
использованию понятий - умножение и деление на полином и т.д.

Ближе к истине то, что CRC является обычной хеш-функцией или "сверткой",
не более чем. В процессе работы входной массив данных "перемешивает"
строку фиксированной длины: или по-другому - последовательно сдвигаем
массив данных, если на выходе "1" - делаем XOR со строкой CRC и все !

Декодирование - это не умножение на полином, а точно такое же хеширование.
К сжалению попытка математизировать эту простую функцию привела к хаосу.

Проще понять ее на "железе" - в инете есть примеры сдвиговых регистров CRC.

Go to the top of the page
 
+Quote Post
ADA007
сообщение Jan 5 2013, 12:00
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 218
Регистрация: 2-02-09
Из: Харьков
Пользователь №: 44 266



В продолжение данной темы....
Может ли кто-нибудь представить здесь матиматическое решения даной задачи?
т.е. как бы это решалось в виде формулы
0xD1 = x^7+x^2+1
0x25 = x^5+x^2+1
и это надо поделить друг на друга...
как из (x^7+x^2+1)*x^N mod x^5+x^2+1 получить x^4+x^2+x^1 ?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 05:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016