|
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] места в оперативке нет, во флеше тоже... придется побайтно считать
|
|
|
|
|
 |
Ответов
|
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
|
|
|
|
Сообщений в этой теме
toweroff CRC32 Mar 1 2015, 21:16 VAI Вот 2 функции, одна "железная" для STM32... Mar 2 2015, 05:49 toweroff Спасибо!
У меня не STM и не старшие кортексы ... Mar 2 2015, 06:50 blackfin Цитата(toweroff @ Mar 2 2015, 09:50) Эта ... Mar 2 2015, 07:05  toweroff Цитата(blackfin @ Mar 2 2015, 10:05) Там,... Mar 2 2015, 07:32 ViKo А вы перешлите второй раз прошивку для верификации... Mar 2 2015, 08:14 toweroff Цитата(ViKo @ Mar 2 2015, 11:14) А вы пер... Mar 2 2015, 10:48 VAI Цитата(ViKo @ Mar 2 2015, 12:14) А вы пер... Mar 2 2015, 11:02  toweroff Цитата(VAI @ Mar 2 2015, 14:02) Запись же... Mar 2 2015, 11:20 adnega Типичный кусок кода для бестабличного вычисления:
... Mar 2 2015, 11:12 jcxz Цитата(adnega @ Mar 2 2015, 17:12) Типичн... Mar 2 2015, 11:38  toweroff Цитата(jcxz @ Mar 2 2015, 14:38) У нас бу... Mar 2 2015, 11:55  Сергей Борщ Цитата(jcxz @ Mar 2 2015, 13:38) Также мо... Mar 2 2015, 14:48   jcxz Цитата(Сергей Борщ @ Mar 2 2015, 20:48) Я... Mar 2 2015, 14:55    Сергей Борщ Цитата(jcxz @ Mar 2 2015, 16:55) Я как ра... Mar 2 2015, 16:16 ViKo Кусками или целиком - какая разница? Сначала запис... Mar 2 2015, 11:18 SM Для CRC-32 такие конструкции категорически не выго... Mar 2 2015, 17:13 Сергей Борщ Цитата(SM @ Mar 2 2015, 19:13) Для CRC-32... Mar 3 2015, 07:54  SM Цитата(Сергей Борщ @ Mar 3 2015, 10:54) о... Mar 3 2015, 08:11   Сергей Борщ Цитата(SM @ Mar 3 2015, 10:11) Это что зн... Mar 3 2015, 09:08 SM в общем, объясню на примере 0x8408:
1)
byte ^= cr... Mar 3 2015, 10:49 Сергей Борщ Такс. Я разобрался. 0x8408, сдвиг вправо. За время... Mar 3 2015, 12:24 SM Цитата(Сергей Борщ @ Mar 3 2015, 15:24) Т... Mar 3 2015, 12:50  Сергей Борщ Цитата(SM @ Mar 3 2015, 14:50) Короче, им... Mar 3 2015, 14:06   SM Цитата(Сергей Борщ @ Mar 3 2015, 17:06) Н... Mar 3 2015, 14:23    Сергей Борщ Цитата(SM @ Mar 3 2015, 16:23) То есть, 0... Mar 3 2015, 16:05 toweroff Подниму тему вот по какому вопросу
Когда пользова... Mar 11 2015, 18:34 SM Цитата(toweroff @ Mar 11 2015, 21:34) но ... Mar 11 2015, 18:49 toweroff Да суть-то не в этом - с нулем или константой срав... Mar 11 2015, 18:58 SM Цитата(toweroff @ Mar 11 2015, 21:58) Есл... Mar 11 2015, 19:04  toweroff Цитата(SM @ Mar 11 2015, 22:04) Эту конст... Mar 11 2015, 19:32   SM Цитата(toweroff @ Mar 11 2015, 22:32) хмм... Mar 11 2015, 19:42 ViKo Пользуюсь аппаратным CRC32 в STM32, никаких перест... Mar 12 2015, 03:51 toweroff Цитата(ViKo @ Mar 12 2015, 06:51) Пользую... Mar 12 2015, 04:48 ViKo В аппаратном CRC STM32 перед началом расчета нужно... Mar 12 2015, 06:16 toweroff Вот о чем я и говорил - если не инвертировать, то ... Mar 12 2015, 09:58 SM Цитата(toweroff @ Mar 12 2015, 12:58) Вот... Mar 12 2015, 10:02 toweroff Просто может возникнуть необходимость проверить ... Mar 12 2015, 11:09
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|