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

 
 
6 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Алгоритм CRC16
defunct
сообщение Apr 13 2010, 19:16
Сообщение #16


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(demiurg_spb @ Apr 13 2010, 10:02) *
Приведите Вашу альтернативу. И укажите, что конкретно Вам не понравилось.

Не понравилось то, что в одной строке и условие и действие. Читать - не наглядно, править неудобно (например при правке условия съедет форматирование), а отлаживать - совсем никак (ни printf не вставить, ни точку останова не поставить).

Цитата(demiurg_spb @ Apr 13 2010, 10:02) *
Но ведь это Ваш пример а не мой...

Сходство в том, что навалено в одну строку много несвязанных действий.
Так наглядней видно насколько НЕпрозрачным при этом становится код.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 13 2010, 19:28
Сообщение #17


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(defunct @ Apr 13 2010, 23:31) *
Не понравилось то, что в одной строке и условие и действие. Читать - не наглядно, править неудобно (например при правке условия съедет форматирование), а отлаживать - совсем никак (ни printf не вставить, ни точку останова не поставить).
С этим можно согласится и я очень часто выношу тело условия в отдельный блок со скобками, но когда есть нечто схожее в ветвях условий (например присвоение одной и той же переменной (crc в данном случае) значения и после if, и после else) и само тело мизерно, то я всегда предпочитаю не раздувать строки. Этот случай типичный, т.к. мизерное тело условия и отлаживать и править не надо. Всё дело вкуса и привычки. А аргументацию всегда найти несложно.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 13 2010, 22:04
Сообщение #18


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(demiurg_spb @ Apr 13 2010, 22:43) *
то я всегда предпочитаю не раздувать строки.

По крайней мере можно так:
Код
if (crc & 1)  
    crc = (crc >> 1) ^ 0xA001;
else
    crc = (crc >> 1);


printf все еще поставить нельзя, но все остальное мной перечисленное - убирается. в т.ч. не придется изначально вручную с помощью пробелов форматировать строку с else.
Go to the top of the page
 
+Quote Post
vallav
сообщение Apr 14 2010, 10:13
Сообщение #19


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

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(demiurg_spb @ Apr 13 2010, 23:23) *



Вы к чему эту ссылку привели?
Там есть - как считать CRC, но там нет - чем CRC лучше простой суммы с той же разрядностью.
Кроме одного случая - в случае, когда двойные ошибки в одном разряде, CRC лучше.
А разве с этим кто либо спорил?
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Apr 14 2010, 11:34
Сообщение #20


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



О CRC
Считая CRC верным можно пытаться восстановить данные, по простой сумме это делать бессмысленно. Далее можно смотреть кодирование/декодирование.
IMHO, CRC это кодирование, но редко делается декодирование с исправлением ошибок.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
vallav
сообщение Apr 14 2010, 12:05
Сообщение #21


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

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(mdmitry @ Apr 14 2010, 15:49) *
О CRC
Считая CRC верным можно пытаться восстановить данные, по простой сумме это делать бессмысленно. Далее можно смотреть кодирование/декодирование.
IMHO, CRC это кодирование, но редко делается декодирование с исправлением ошибок.


Как это?
При простой сумме, если ошибка одиночная - неизвестно в каком слове ошибка, но хоть известно, в каком разряде.
При CRC не известно ни в каком слове, ни в каком разряде.
CRC лучше простой суммы на маленьких блоках - при правильном перемешивании можно отловить больше двойных ошибок.
Но вот какое из перемешиваний - правильное?
Да и двойная ошибка на маленьком блоке - явление редкое.
Обычно или одиночные ошибки или сразу много.
А тут, что CRC, что простая сумма - примерно одинаковы.
Только простая сумма считается несравненно проще.

Кодирование и декодирование с исправлением ошибок делается довольно часто - например, все CD-ROM работают только благодаря
этому. Редко можно найти CD-диск, у которого нет хотя бы десятка исправленных C1 ошибок при чтении.
Обычно же их на диск несколько десятков тысяч.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 14 2010, 19:05
Сообщение #22


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(vallav @ Apr 14 2010, 14:28) *
Там есть - как считать CRC, но там нет - чем CRC лучше простой суммы с той же разрядностью.
Вы что смеётесь? Вероятность пропуска ошибки CRC16 1 к 2^16, CRC32 1 к 2^32, а для простой суммы на ПОРЯДКИ больше!!!
Вы что ещё до сих пор верите в благотворительность? То что просто заXORить массив намного менее затратно чем посчитать CRC я не спорю, но что-то мне подсказывает, что и вероятность пропуска ошибки примерно (прюс-минус трамвайная остановка, конечно)smile.gif во столько же раз больше.
За всё надо платить - закон сохранения энергии, однако!


Цитата(defunct @ Apr 14 2010, 02:19) *
По крайней мере можно так:
Код
if (crc & 1)  
    crc = (crc >> 1) ^ 0xA001;
else
    crc = (crc >> 1);
Не, не моё это:-) Я либо в строку форматирую, либо уж по полной программе со скобочками.
К полумерам не привык! Два по сто в одной посуде!:)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
vallav
сообщение Apr 15 2010, 05:10
Сообщение #23


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

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(demiurg_spb @ Apr 14 2010, 23:20) *
Вы что смеётесь? Вероятность пропуска ошибки CRC16 1 к 2^16, CRC32 1 к 2^32, а для простой суммы на ПОРЯДКИ больше!!!
Вы что ещё до сих пор верите в благотворительность? То что просто заXORить массив намного менее затратно чем посчитать CRC я не спорю, но что-то мне подсказывает, что и вероятность пропуска ошибки примерно (прюс-минус трамвайная остановка, конечно)smile.gif во столько же раз больше.
За всё надо платить - закон сохранения энергии, однако!


Вы полагаете, это аргумент - все так делают, поэтому так делать - правильно?

Закон сохранения энергия вроде не гласит - чем больше энергии затрачено, тем лучше вещь получается...

Вероятность пропуска ошибки CRC16 1 к 2^16, CRC32 1 к 2^32 - знаете, как считается?
Всего разных значений у 16 битного числа 2^16, если ошибка равновероятно порождает одно из значений, то вероятность, что она
породит нужное, равна 1 к 2^16.
Это справедливо для многобитной ошибки ( например, от мощной импульсной помехи ), но справедливо как для CRC, так и для прямой суммы.

Исторически CRC появилась по простой причине - в механических телетайпах основной ошибкой были сбои в одном из реле, что порождало
многократные ошибки в одном из разрядов. СRC тут намного лучше прямой суммы.
Но времена те ушли, а CRC осталось...

Кстати, прямая сумма чуть лучше побитового XOR - пропускает в два раза меньше двойных ошибок в одном разряде.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 15 2010, 06:11
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(vallav @ Apr 15 2010, 08:25) *
Всего разных значений у 16 битного числа 2^16, если ошибка равновероятно порождает одно из значений, то вероятность, что она
породит нужное, равна 1 к 2^16.
Это справедливо для многобитной ошибки ( например, от мощной импульсной помехи ), но справедливо как для CRC, так и для прямой суммы.

Забыли добавить, что для простой суммы равновероятность пораждения одного из значений CRC имеет место при очень больших размерах блока
Go to the top of the page
 
+Quote Post
vallav
сообщение Apr 15 2010, 06:22
Сообщение #25


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

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(Палыч @ Apr 15 2010, 10:26) *
Забыли добавить, что для простой суммы равновероятность пораждения одного из значений CRC имеет место при очень больших размерах блока


Вы хотели сказать, при размерах поражения порядка длины контрольного слова?
То есть когда поражено несколько бит?

Повторюсь - CRC лучше для двойных регулярных ошибок ( когда они в одном разряде ).
В остальных случаях - надо специально разбираться.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 15 2010, 06:57
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(vallav @ Apr 15 2010, 09:37) *
Повторюсь - CRC лучше для двойных регулярных ошибок ( когда они в одном разряде ).
Интуитивно понятно, и - спору нет.
Цитата(vallav @ Apr 15 2010, 09:37) *
В остальных случаях - надо специально разбираться.
При длине блока даже в 256 байт простая сумма будет менее 2^16. Даже при бОльшей длине блока не будет выполняться равновероятность пораждения одного из значений CRC (ситуацию нЕсколько спасёт циклическая сумма). Для суммы: только при очень большой длине блока (строго говоря - бесконечной) это условие выполнится.
Go to the top of the page
 
+Quote Post
vallav
сообщение Apr 15 2010, 07:19
Сообщение #27


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

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(Палыч @ Apr 15 2010, 11:12) *
Интуитивно понятно, и - спору нет.
При длине блока даже в 256 байт простая сумма будет менее 2^16. Даже при бОльшей длине блока не будет выполняться равновероятность пораждения одного из значений CRC (ситуацию нЕсколько спасёт циклическая сумма). Для суммы: только при очень большой длине блока (строго говоря - бесконечной) это условие выполнится.


При длине блока в 4 байта простая сумма может быть больше, чем 2^16.
Или Вы хотите суммировать байты для получения 16 разрядной контрольной суммы?
Какой смысл - складывать в старший байт переносы?
Вроде при этом надо суммировать 16 разрядные слова.

Кстати, простая сумма не пропустит ни одного едеичного поражения длиной менее 17 бит.
CRC может пропустить ( от конкретного способа перемешивания бит зависит ).
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 15 2010, 08:04
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(vallav @ Apr 15 2010, 10:34) *
Или Вы хотите суммировать байты для получения 16 разрядной контрольной суммы?
Извините, но Вы так и делаете: получаете сумму значений 76 байт, а не 38 слов (см. функцию void SumCRCNew(unsigned int len) ).

P.S.Поправка: делает это athlon64, но Вы его решения защищаете
Go to the top of the page
 
+Quote Post
vallav
сообщение Apr 15 2010, 09:34
Сообщение #29


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

Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977



Цитата(Палыч @ Apr 15 2010, 12:19) *
Извините, но Вы так и делаете: получаете сумму значений 76 байт, а не 38 слов (см. функцию void SumCRCNew(unsigned int len) ).

P.S.Поправка: делает это athlon64, но Вы его решения защищаете


С чего Вы взяли, что я настаиваю именно на таком вычислении контрольной суммы?
Я просто спросил - почему CRC лучше прямой суммы.
Вы согласны, что посчитать 16 битную сумму столь же просто, как и 8 битную?
И намного проще и быстрее, чем правильное 16 битное CRC?

Так что скажите для случая 16 битной суммы?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 15 2010, 10:00
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(vallav @ Apr 15 2010, 12:49) *
Вы согласны, что посчитать 16 битную сумму столь же просто, как и 8 битную?
И намного проще и быстрее, чем правильное 16 битное CRC?

Конечно - проще!

Цитата(vallav @ Apr 15 2010, 12:49) *
Я просто спросил - почему CRC лучше прямой суммы... Так что скажите для случая 16 битной суммы?

Потому, что при случайных с равномерным распределением данных (общий случай) распределение значений простой суммы далека от равномерного (P.S. при длине блока данных больше 6 можно считать, что имеем близкий к нормальному закон распределения), особенно при "малых" значениях длины блока данных. В CRC с распределением значений - тоже не всё гладко, но гораздо лучше, чем у суммы.
Go to the top of the page
 
+Quote Post

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

 


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


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