| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > CRC-8 |
| Автор: podval 3.11.2004, 18:44 |
| Нужно посчитать 8-битное CRC для строки из N байт. Полином: X^8 + X^4 + X^3 + X^2 + 1 Начальное заполнение регистра: 0F или 00001111 не получается |
| Автор: Crait 4.11.2004, 02:11 |
| Podval, а что именно не получается ? Мобыть, несколько не в тему, но когда-то и мне нужно было сделать CRC8. Так я по ленности своей вычислял CRC16 (имелся под рукой такой модуль), а потом ксорил старший и младший байты результата. Работало (всмысле, определяло ошибки, а также и в качестве хеш-функции). Кстати, если не секрет, откуда порождающий полином для CRC8 ? |
| Автор: podval 4.11.2004, 08:55 | ||||||
Я пробовал так:
Проблема в том, что crc8 возвращается не то, какое надо. Пробовал и это:
Получается другой результат и тоже неправильный. Я так понимаю, что второй вариант не адаптирован под мой полином. Может как-то можно адаптировать? Но более всего непонятно, почему первый вариант выдает не то. З.Ы. Полином из спецификации SBC-кодека. Добавлено @ 09:00
Как? Друг с другом? |
| Автор: Crait 4.11.2004, 11:06 | ||
Ну да. Могу еще посоветовать перебрать все 8-бит полиномы и инициирующие значения - это не так и много - 65536 вариантов. ЗЫ А может еще и результат с чем-нибудь ксорится - тут без анализа нескольких вариантов вход-выход не обойтись. |
| Автор: podval 4.11.2004, 11:14 |
| Не, результат ни с чем не ксорится. |
| Автор: Crait 4.11.2004, 11:34 | ||||
| Вот, откопал у себя еще вариант CRC8. ПисАл не я. crc8.h :
crc8.cpp :
|
| Автор: podval 4.11.2004, 11:41 |
| Дык это ж то же самое |
| Автор: Crait 4.11.2004, 11:54 |
| Ага. Подумал, может, полином у тебя именно такой, как в этом исходнике. |
| Автор: podval 5.11.2004, 11:18 | ||
Нашел! Таблицу надо формировать "зеркально":
|
| Автор: podval 26.11.2004, 14:56 |
| Как переделать этот алгоритм, чтобы он обрабатывал не байты, а полубайты? Проблема в том, что мне надо обработать строку, которая не умещается в целое число байт. Остановить подсчет CRC надо именно на последнем полубайте. Последний же из приведенных здесь табличных алгоритмов разработан под обработку целого числа байт и не может обработать, например 6 и 1/2 байта. |
| Автор: oleg1973 27.11.2004, 19:22 | ||
а вот для полубайтов |
| Автор: Crait 27.11.2004, 22:57 |
| Могу рассказать, как формировать CRC побитно. Это актуально, podval ? |
| Автор: podval 29.11.2004, 10:06 | ||
| Crait Я думал, что и так это знаю, только у меня почему-то побитный результат не совпал с табличным. Я считал для такой строки: 2С 2А 00 00 00 0 . У меня получилось 8D, а правильный ответ Е8. Вот еще и код слепил:
Что не так? Если я и правда что-то недоучил, то с меня пол-литры Еще раз попытаюсь объяснить ситуацию. Кодек-образец и мой кодек (с табличным алгоритмом) работают в плане вычисления CRC одинаково до тех пор, пока надо вычислять CRC на целом количестве байт. КАК ИМЕННО надо вычислять CRC в ситуации, когда данные занимают сколько-то с половиной байт, в спецификации не указано (руки оторвать писателям! Однако такой же CRC, как я выяснил, используется в GSM/TCH/EFS Precoder. Может кто-то знает, как там разруливается эта ситуация? Добавлено @ 10:09 oleg1973 Я попытасюсь вспомнить асм Только че-то не скачивается ехе. |
| Автор: podval 29.11.2004, 10:41 |
| Поигрался сейчас с отбрасыванием лишних пол-байт и дополнением нулями до байта - туфта выходит. Не совпадает с refrence codec. Наверное, в консерватории надо что-то поправить. Поможите, люди добрые! |
| Автор: podval 29.11.2004, 17:17 | ||
Кажись, обнаружил пробел в "консерватории". Вот так работает, если ксорить на каждом шаге содержимое регистра с байтом сообщения и проверять старший бит результата:
|
| Автор: LuLok 19.2.2007, 15:27 | ||
я реализовал CRC8 вот так:
Если верить книжке Ross N. Williams. "Элементарное руководство по CRC-алгоритмам обнаружения ошибок", то считает правильно... |