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

 
 
> Как дополнить данные до нулевой CRC?
ViKo
сообщение May 16 2018, 13:57
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Вот здесь тренируюсь:
http://crccalc.com/

Почитал здесь для просветления в тонких местах:
https://ru.wikipedia.org/wiki/%D0%A6%D0%B8%...%BA%D0%BE%D0%B4

Ввожу число: 00000000 Hex, вычисляю CRC-32. Для CRC-32/MPEG-2 вижу результат 0xC704DD7B.
Добавляю его к данным: 00000000 C704DD7B
Вычисляю, получаю CRC-32/MPEG-2 0x00000000.
Здесь все понятно, поскольку биты входных данных и результата не реверсируются и выход не инвертируется. С инверсией выхода тоже понятно.

А как дополнить данные, если делается реверс битов? Что добавить к данным 00000000, чтобы результат стал 0x00000000? Что-то не получается.

Разобрался. Для RefIn true, RefOut true, XorOut 0xFFFFFFFF нужно CRC инвертировать и изменить порядок байтов (не битов!).

Для 00000001 CRC-32 = 0x5643EF8A, инверсия: 0xA9BC1075, перестановка байтов: 0x7510BCA9
Для 00000001 7510BCA9 CRC-32 = 0xFFFFFFFF

Почему так? Нет ли ошибки в расчетах на сайте?

Данные можно задавать в поле в таком виде:
00 00 00 01
По байтам. Ничего не меняется.
Ага, значит, CRC работает с байтами. Поэтому результат CRC нужно просто разбить на байты. Но почему тогда CRC без реверса битов не требует перестановки байтов?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
toweroff
сообщение May 16 2018, 18:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



А для чего это?
для сверки какая разница - ноль или не ноль...
для совсем надежности - два разных алгоритма, тогда подбор "до нуля" теряет смысл, слишком много комбинаций. Тем более, если все место занято именно исполняемым кодом, а не некритичными данными
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 16 2018, 19:30
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(toweroff @ May 16 2018, 21:18) *
А для чего это?
для сверки какая разница - ноль или не ноль...
для совсем надежности - два разных алгоритма, тогда подбор "до нуля" теряет смысл, слишком много комбинаций. Тем более, если все место занято именно исполняемым кодом, а не некритичными данными

Не понял, про какой ноль идет речь.
Задача простая. К структуре данных в микроконтроллере по вычисленной CRC данных добавить CRC-дополнение для контроля целостности. Потом, вычисляя CRC "структуры, дополненной CRC" получу результат 0x00000000 или 0xFFFFFFFF (если инверсию на выходе сделаю).
Есть значения элементов структуры по умолчанию. Вот для них хочу вычислить CRC онлайн калькулятором, но таким алгоритмом, чтобы совпадал с функцией внутри микроконтроллера. И сразу забить их в исходный код программы.

Для показанного онлайн калькулятора нашел дополнения для всех CRC. Но остаюсь в недоумении.
Если инверсия выхода не делается, то биты CRC данных в дополнении не инвертируются. Это понятно.
Если реверс входных (и выходных) битов не делается, то байты дополнения задаются в порядке big-endian. Если биты реверсируются, то порядок байтов little-endian. Вот эта особенность мне непонятна!

Ну, для своей задачи я научился считать CRC. Дополняю свои данные CRC-32/JAMCRC. Вычисляю в процессоре CRC с реверсом битов. Проверил в отладчике.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 17 2018, 06:17
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ViKo @ May 16 2018, 22:30) *
Задача простая. К структуре данных в микроконтроллере по вычисленной CRC данных добавить CRC-дополнение для контроля целостности.

А какой практических смысл таких усилий? Зачем это всё?
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 17 2018, 07:11
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(jcxz @ May 17 2018, 09:17) *
А какой практических смысл таких усилий? Зачем это всё?

Структура, содержащая переменные, управляющие режимами работы прибора, находится в памяти с батарейным питанием. При включении прибора нужно проверить ее целостность.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 17 2018, 10:13
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ViKo @ May 17 2018, 10:11) *
Структура, содержащая переменные, управляющие режимами работы прибора, находится в памяти с батарейным питанием. При включении прибора нужно проверить ее целостность.

Я не спрашиваю "зачем Вам CRC?" Я спрашиваю "Чем не устраивает простая операция == для проверки правильности CRC?"

Цитата(k155la3 @ May 17 2018, 10:17) *
когда надо экономить наносекунды при получении информаци - скоростные коммутаторы пакетов итп. и аппаратной реализации.

Ничего не понял.... wacko.gif
Почему не:
Код
struct DataFrame {
  ...
  u32 crc;
} data;
if (CRC32(&data, sizeof(data) - sizeof(data.crc), ~0) == data.crc) printf("CRC OK");
else printf("Bad CRC");

???
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 18 2018, 08:45
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(jcxz @ May 17 2018, 13:13) *
Ничего не понял.... Почему не . . .
При приеме "битового" потока (фрейм из канала связи или например с дискового накопителя), параллельно с заполнением буфера идет подсчет в сдвиговом регистре CRC. Для контроля целостности пакета достаточно после прихода фрейма проверить содержимое рег.CRC на 0x0000. (тк фрейм "закрывается" байтами-битами CRC).
Соотв-но нет никаких доп. операций копирования, сравнения итп. (проверка на 0 выполняется в любом случае быстрее).
ps - Это имеет смысл только для скоростной аппаратной реализации.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ViKo   Как дополнить данные до нулевой CRC?   May 16 2018, 13:57
- - k155la3   >> Ага, значит, CRC работает с байтами. Воо...   May 16 2018, 14:28
- - ViKo   Я соображаю, как рассчитывается CRC, однако реализ...   May 16 2018, 15:16
- - Serge V Iz   CRCn- это остаток от деления на неприводимый много...   May 16 2018, 17:09
|- - ViKo   Цитата(Serge V Iz @ May 16 2018, 20:09) А...   May 16 2018, 17:42
|- - toweroff   Цитата(ViKo @ May 16 2018, 22:30) Не поня...   May 17 2018, 02:43
||- - mcheb   Цитата(toweroff @ May 17 2018, 06:43) Теп...   May 17 2018, 08:15
||- - toweroff   Цитата(mcheb @ May 17 2018, 11:15) А попо...   May 17 2018, 14:58
||- - ViKo   Цитата(jcxz @ May 17 2018, 13:09) Я не сп...   May 17 2018, 10:14
|||- - jcxz   Цитата(ViKo @ May 17 2018, 13:14) А чем в...   May 17 2018, 10:18
|||- - ViKo   Цитата(jcxz @ May 17 2018, 13:18) Может и...   May 17 2018, 10:23
|- - k155la3   Цитата(jcxz @ May 17 2018, 09:17) А какой...   May 17 2018, 07:17
- - ViKo   Ну, средство то же. Цель только другая.   May 17 2018, 03:27
- - Serge V Iz   Да и в программной меньше букв писать. Только есл...   May 21 2018, 06:52


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

 


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


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