Перейти к содержанию
    

Здравствуйте!

 

Подскажите пожалуйста по поводу взаимодействия двух устройств с разными реализациями 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;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

45 minutes ago, addi II said:

На "моей" практике результаты этих CRC32 не бьются, такое может быть или это моя ошибка?

Ваша ошибка в том, что вы считаете что CRC32 это какой то один единственный алгоритм, а это не так. Их мульён (точнее их несколько разновидностей, и для любой из них есть как минимум 1 32х битный параметр, называемый полином, который и определяет, что именно будет считаться. И полиномы эти разные)

Тут уже многократно приводили ссылки на сайты с калькуляторами CRC, генераторами и чёрт ещё знает чем 🙂

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть Вы хотите сказать что и результаты эти алгоритмы будут давать разные при равных вводных?

И в этом случае мне нужно реализовывать тот алгоритм CRC32 который используется при подсчете МК?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 минут назад, xvr сказал:

и для любой из них есть как минимум 1 32х битный параметр, называемый полином, который и определяет, что именно будет считаться.

Кроме полинома, есть ещё:

1) начальное значение;

2) конечное XOR-значение;

3) инверсия направления битов входных данных;

4) инверсия направления битов результата.

Так что даже с одним и тем же полиномом "биться" не обязан.

24 минуты назад, addi II сказал:

То есть Вы хотите сказать что и результаты эти алгоритмы будут давать разные при равных вводных?

Вас в гугле забанили?? :unknw:

Сайтов, на которых можно посчитать CRC в разных вариациях - вагон+тележка. Например: http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

Позволяет задать и полином и все вышеописанные опции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите пожалуйста по поводу взаимодействия двух устройств с разными реализациями CRC32
Однозначно - "бесполезняк". Единая реализация должна быть.

То есть Вы хотите сказать что и результаты эти алгоритмы будут давать разные при равных вводных
Да, но подсчет CRC для данных с их CRC в отсутствие ошибок даст 0; для чего и применяется.
Изменено пользователем Obam

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...