addi II 0 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба Здравствуйте! Подскажите пожалуйста по поводу взаимодействия двух устройств с разными реализациями CRC32 Есть два устройства: 1) ПК; 2) плата с МК; ПК шлет файл МК и необходимо проверить CRC32. На ПК реализован алгоритм с таблицей а на МК без. Вот что на ПК: http://www.prog.org.ru/topic_26908_0.html А на МК (вариант b): https://web.archive.org/web/20190108202303/http://www.hackersdelight.org/hdcodetxt/crc.c.txt На "моей" практике результаты этих CRC32 не бьются, такое может быть или это моя ошибка? П.С. Комбинированная версия реализованная на ПК, также не бьеться с МК-шной quint32 CRC32::fromIODevice( QIODevice * device ) { quint32 crc32 = 0xffffffff; char * buf = new char[ BUFSIZE ]; qint64 n; int i, j; uint32_t byte, crc, mask; //custom_printf("*message = \n",*message); i = 0; crc = 0xFFFFFFFF; while( ( n = device->read( buf, BUFSIZE ) ) > 0 ) { byte = buf[i]; // Get next byte. if (i < 32) qDebug() << "something is going"; crc = crc ^ byte; for (j = 7; j >= 0; j--) { // Do eight times. mask = -(crc & 1); crc = (crc >> 1) ^ (0xEDB88320 & mask); } i = i + 1; } delete buf; return ~crc; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба 45 minutes ago, addi II said: На "моей" практике результаты этих CRC32 не бьются, такое может быть или это моя ошибка? Ваша ошибка в том, что вы считаете что CRC32 это какой то один единственный алгоритм, а это не так. Их мульён (точнее их несколько разновидностей, и для любой из них есть как минимум 1 32х битный параметр, называемый полином, который и определяет, что именно будет считаться. И полиномы эти разные) Тут уже многократно приводили ссылки на сайты с калькуляторами CRC, генераторами и чёрт ещё знает чем 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
addi II 0 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба То есть Вы хотите сказать что и результаты эти алгоритмы будут давать разные при равных вводных? И в этом случае мне нужно реализовывать тот алгоритм CRC32 который используется при подсчете МК? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба 35 минут назад, xvr сказал: и для любой из них есть как минимум 1 32х битный параметр, называемый полином, который и определяет, что именно будет считаться. Кроме полинома, есть ещё: 1) начальное значение; 2) конечное XOR-значение; 3) инверсия направления битов входных данных; 4) инверсия направления битов результата. Так что даже с одним и тем же полиномом "биться" не обязан. 24 минуты назад, addi II сказал: То есть Вы хотите сказать что и результаты эти алгоритмы будут давать разные при равных вводных? Вас в гугле забанили?? Сайтов, на которых можно посчитать CRC в разных вариациях - вагон+тележка. Например: http://www.sunshine2k.de/coding/javascript/crc/crc_js.html Позволяет задать и полином и все вышеописанные опции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 32 30 июня, 2023 Опубликовано 30 июня, 2023 (изменено) · Жалоба Подскажите пожалуйста по поводу взаимодействия двух устройств с разными реализациями CRC32 Однозначно - "бесполезняк". Единая реализация должна быть. То есть Вы хотите сказать что и результаты эти алгоритмы будут давать разные при равных вводных Да, но подсчет CRC для данных с их CRC в отсутствие ошибок даст 0; для чего и применяется. Изменено 30 июня, 2023 пользователем Obam Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 30 июня, 2023 Опубликовано 30 июня, 2023 · Жалоба В 30.06.2023 в 18:06, addi II сказал: То есть Вы хотите сказать что и результаты эти алгоритмы будут давать разные при равных вводных? И в этом случае мне нужно реализовывать тот алгоритм CRC32 который используется при подсчете МК? Результаты должны быть одинаковыми при равных вводных. Проверить у кого правильно просто. Например вводная //====================================================================================== //G(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + 1 //====================================================================================== // Module Name = crc_32_8 // CRC Width = 32 // Data Width = 8 // CRC Init = ffff_ffff // RefIn = true // RefOut = true // Polynomial = 04C11DB7 // Check = CBF43926 (8'h31, 8'h32....8'h39) // Check with magic world = C704DD7B //============================================ CRC посылки (8'h31, 8'h32....8'h39) - CBF43926 (заранее известно). CRC посылки 8'h31, 8'h32....8'h39, 8'h26, 8'h39, 8'hf4, 8'hcb - magic world = C704DD7B Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xVekx 0 1 июля, 2023 Опубликовано 1 июля, 2023 · Жалоба https://opensource.apple.com/source/zlib/zlib-5/zlib/crc32.c.auto.html - начать с этого тут проще. свой полином подставляем в /* terms of polynomial defining this crc (except x^32): */ static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; ну и 3 варианта реализации 😃 из рабочего проекта bootloader-a. crc32_base.c crc32_base.h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться