Димон Безпарольный 0 Posted January 13 (edited) · Report post Считаю контрольную сумму 16-ти байт Quote 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F Формирую бинарный файл с этими данными, получаю результат 0xСECEE288(crc файла в Проводнике). Контроллер выдает 0x31311D77. Загнал алгоритм (код ниже) в C-Free компилятор. Тоже получил 0xСECEE288. Сравнил сформированные таблицы - одинаковые. Закипел. Код формирования таблицы unsigned long crc_table[256]; Таблица глобальная void Crc32Init(void) { unsigned long crc; for (int i = 0; i < 256; i++) //инициализируем таблицу расчёта Crc32 { crc = i; for (int j = 0; j < 8; j++) //цикл перебора полинома crc = crc & 1 ? (crc >> 1) ^ 0xEDB88320UL : crc >> 1; crc_table[i] = crc; } inCRC = 0xFFFFFFFF; } Код самого подсчета unsigned long int Crc32(unsigned char Byte) { inCRC = (inCRC >> 8) ^ crc_table[(inCRC ^ Byte) & 0xFF]; return inCRC ^ 0xFFFFFFFF; } inCRC - глобальная переменная unsigned long int inCRC = 0xFFFFFFFF; в которой накапливается сумма. Может подскажет кто, где я накосячил? Edited January 13 by Димон Безпарольный Quote Ответить с цитированием Share this post Link to post Share on other sites
Obam 0 Posted January 13 · Report post 2 * 2, конечно, "сэм-восэм", но c 1 до 15 никак не 16 чисел, входные байты могут и "зеркалиться" относительно их середины. А "если мы с вами посмотрим, то мы с вами увидим" ((с) моя школьная историчка): 0xСECEE288 инверсия 0x31311D77. Quote Ответить с цитированием Share this post Link to post Share on other sites
Димон Безпарольный 0 Posted January 14 · Report post 8 hours ago, Obam said: 0xСECEE288 инверсия 0x31311D77 Точно инверсия. Буду разбираться откуда она берется. Сам алгоритм выдает на двух компиляторах данные без инверсии. Quote Ответить с цитированием Share this post Link to post Share on other sites