|
CRC32, uint32_t |
|
|
|
Mar 1 2015, 21:16
|

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

|
Добрый день! Нужна софтовая реализация. Не проблема, гугел их находит не задумываясь Но из того, что я находил, даже табличная реализация считает по 1 байту А хотелось бы найти подсчет сразу по 32 бита, не по 8. Благо мой массив данных всегда кратен 4 байтам, а аппаратного CRC на борту контроллера нет По идее, это же должно увеличить производительность?  UPD что-то нашел от Интела черт... там используются 4 таблицы из uint32_t[256] места в оперативке нет, во флеше тоже... придется побайтно считать
|
|
|
|
3 страниц
< 1 2 3
|
 |
Ответов
(30 - 39)
|
Mar 11 2015, 19:42
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(toweroff @ Mar 11 2015, 22:32)  хмм.. получается, что эта константа и есть именно константа? при разных данных меняться не будет? Да. Короче, если проинициализировать регистр-аккумулятор CRC неким числом, и пропустить через CRC после этой инициализации это же число, но проинвертированное, по разрядности равное разрядности самой CRC, то получится всегда одна и та же константа, которая зависит только от полинома, а не от этого числа. Аналогично и с Вашим нулем - если проинициализировать регистр числом, и потом пропустить это же число, получится всегда ноль. PS Разумеется, это если еще и разряды не переставлены через зад в шахматном порядке, как в LCRC/ECRC PCI Express-а, например.
|
|
|
|
|
Mar 12 2015, 08:45
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(toweroff @ Mar 11 2015, 23:12)  расчет CRC32 для обоих случаев блоков [BODY1+CRC1] и [BODY2+CRC2] должен дать одинаковый результат, который есть константа для данного полинома? Да. Именно так. При условии, что последовательность бит в CRC не перевернута и не переставлена. Для неинвертированной CRC - ноль. Для инвертированной - некая ненулевая константа. Ищите ошибки у себя. В WinHex, возможно, порядок следования байт неверный сделали, little/big endian, когда CRC добавляли к блоку. Или сдвиг при подсчете CRC был не в ту сторону, чтобы добавлять CRC к блоку, не переворачивая биты задом наперед. А чтобы лучше искалось, где ошибка - вот: CODE #include "memory.h" #include "stdio.h"
typedef unsigned short USHORT; typedef unsigned int UINT;
UINT CRC_EDB88320(char *buf, int len, UINT init) { UINT crc = init; for (int pos = 0; pos < len; pos++) {
crc ^= (UINT)((unsigned char)(buf[pos])); for (int i = 8; i != 0; i--) { if ((crc & 1) != 0) { crc >>= 1; crc ^= 0xEDB88320; } else crc >>= 1; } } return crc; }
int main(int argc, char* argv[]) { char data[32]; UINT crc;
memcpy( data, "0123456", 7); printf ("CRC=%08X\n", crc=CRC_EDB88320(data,7,0xFFFFFFFF)); crc = ~crc; memcpy( data+7, &crc, 4); printf ("CONST=%08X\n", crc=CRC_EDB88320(data,11,0xFFFFFFFF));
memcpy( data, "235547welbxdgu", 14); printf ("CRC=%08X\n", crc=CRC_EDB88320(data,14,0xFFFFFFFF)); crc=~crc; memcpy( data+14, &crc, 4); printf ("CONST=%08X\n", crc=CRC_EDB88320(data,18,0xFFFFFFFF));
memcpy( data, "0123456", 7); printf ("CRC=%08X\n", crc=CRC_EDB88320(data,7,0xFFFFFFFF)); memcpy( data+7, &crc, 4); printf ("CONST=%08X\n", crc=CRC_EDB88320(data,11,0xFFFFFFFF));
memcpy( data, "235547welbxdgu", 14); printf ("CRC=%08X\n", crc=CRC_EDB88320(data,14,0xFFFFFFFF)); memcpy( data+14, &crc, 4); printf ("CONST=%08X\n", crc=CRC_EDB88320(data,18,0xFFFFFFFF));
return 0; }
Вывод этой программы: CRC=7240F711 CONST=DEBB20E3 CRC=28E92D48 CONST=DEBB20E3 CRC=7240F711 CONST=00000000 CRC=28E92D48 CONST=00000000
|
|
|
|
|
Mar 12 2015, 10:02
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(toweroff @ Mar 12 2015, 12:58)  Вот о чем я и говорил - если не инвертировать, то все сходится. Но не сходится с "кошерными" результатами Не... Это именно, о чем я говорил - если не инвертировать, то проверять надо на ноль. Если инвертировать (кошерно) - то на 0xDEBB20E3 (для полинома 0xEDB88320). Что, по сути, без разницы - и то, и это, просто сравнение с константой, и ресурс занимает одинаковый. Вам, вообще, шашечки (чтобы константа была нулем?), или ехать (просто какая-то любая константа?)? Я даже больший секрет раскрою - значение на выходе остается константой (разумеется другой какой-то) при инверсии любого кол-ва любых бит CRC, а не только инверсии ее целиком. А начальная инверсия, и, вообще, начальное значение, на это никак не влияют. Добавлю. Константу, на которую надо проверять при подсчете с инверсной CRC, определить можно еще одним способом - это CRC числа ноль длиной в кол-во разрядов CRC при тех же начальных условиях (инициализации в 0xFFFFFFFF), как считается эта CRC.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|