219 / 16 / 0
Регистрация: 15.08.2016
Сообщений: 39
|
|
1 | |
Нужно переделать алгоритм вычисления CRC32 табличным способом04.12.2019, 23:14. Показов 5627. Ответов 7
Привет всем.
Предисловие. Есть промышленное изделие, в котором надо программно считать CRC32 для блоков данных. Алгоритм определен заказчиком и его никак нельзя менять! Т.к. CRC32 потом сверяется внешней программой на компе и записью в документах. Есть такая проблема. Алгоритм вычисления этой CRC32 реализован сдвигами побитно для каждого нового байта в блоке, т.е. самый медленный из возможных. Блоки бывают большой длины и вычисление занимает приличное время. Все бы хорошо, но алгоритм не совсем стандартный (как я понял). Вопрос в следующем: может ли кто то помочь переделать исходник чтобы реализовать его табличным методом? Т.е. сгенерировать таблицу из 256 (для байтовых входных данных) или 16 (для 4-х битных входных данных) 32-х битных элементов и процедуру для вычисления CRC32 с этой таблицей. Если это вообще возможно. Но пока мне не удалось. На выходе не получается нужная CRC. "Не совсем стандартный метод CRC32" - это означает, что он старый и вычисление идет по несколько иной схеме, чем современные реализации (к которым мы привыкли). Функция совсем простая (реально 6 строк на "Си"), а как переделать на работу с таблицей и как получить саму таблицу? Все файлы и исходник на "Си" (консольное приложение) приложены в архиве, там и текст описания метода. Можно собрать под DOS или Win32 любым компилятором. Я компилировал с помощью Borland C++ 5.5.1 for Win32. Строка "123456789" должна давать в итоге CRC = 0xCCBD34E2. Вложение содержит все подробности и исходник (RAR архив). Заранее буду благодарен.
0
|
|
04.12.2019, 23:14 | |
Ответы с готовыми решениями:
7
Кодирование информации табличным способом. Доказать выражение табличным способом Верстка макета табличным способом Как посчитать интеграл заданный табличным способом |
Мозгоправ
|
||||||
06.12.2019, 16:09 | 2 | |||||
![]() Решение
XRS, без гарантий, поэтому проверяйте:
- по поводу POSIX-функций. А то компилятор ругался. - и обошёл ввод имени файла из командной строки для удобства отладки. В коде остался кое-какой мусор - тоже можно убрать. Пока оставил, если править придётся.
1
|
219 / 16 / 0
Регистрация: 15.08.2016
Сообщений: 39
|
|
07.12.2019, 11:35 [ТС] | 3 |
L0M
Спасибо за ответ! Сейчас компьютер разобран, сложно посмотреть. Проанализирую и отвечу. Спасибо вам!
0
|
219 / 16 / 0
Регистрация: 15.08.2016
Сообщений: 39
|
|||||||||||
10.12.2019, 10:43 [ТС] | 4 | ||||||||||
L0M
Хочу вам выразить огромную благодарность за помощь! Ваше решение оказалось верным. Я проделал эксперимент - с помощью любимого FAR-а собрал имена к ~27000 файлов на ~32 Гб (через временную панель), создал 2 .bat файла (старая и новая версии), запустил, сравнил результаты. Результат сравнения – совпадает полностью (за исключением файлов более 4 Гб, т.к. функция filelength не дает длину для таких файлов и ее надо заменить на GetFileInformationByHandle). Программа ускорилась в 4 раза. Я никогда не занимался алгоритмами CRC, и насколько понял, генерация таблицы зависит только от полинома (она полностью идентична тому, что в исходнике от WMAX). Поэтому у меня такие вопросы:
0
|
Мозгоправ
|
|
10.12.2019, 17:46 | 5 |
XRS, рад, что у вас всё заработало нормально. Я тоже никогда не занимался алгоритмами CRC, и решение было получено скорее методами реверс-инжиниринга, чем математическим анализом алгоритмов. Ну и почитал, конечно.
К такой формуле пришёл исходя из того, что, скорее всего, алгоритм в вашей программе очень старый и надо искать что-то достаточно простое из начала разработки алгоритмов CRC. Почитал Википедию, посмотрел и поэкспериментировал с реализациями из Викиучебника, почитал статью Ross N. Williams Элементарное руководство по CRC-алгоритмам обнаружения ошибок (сильно помогла, рекомендую). Ну и потом паззл сложился. Кстати, у меня не только эта формула изменена, но и сгенерирована новая таблица. Одно без другого работать не будет.
0
|
219 / 16 / 0
Регистрация: 15.08.2016
Сообщений: 39
|
||||||
12.12.2019, 11:17 [ТС] | 6 | |||||
L0M
Викиучебник я смотрел. Смутило то, что в этом алгоритме схема иная. Но оказалось, что таблица приведенная вами идентична тем, которые для этого полинома в современных алгоритмах. Я проверил. Кстати за "Ross N. Williams" спасибо, пригодится. Продолжая тему. В конечном итоге я хотел сделать вот что: для обычного CRC32 (ZIP,RAR) у меня есть реализация, в которой таблица состоит из 16 элементов DWORD, а входной байт разбивается на 2 ниббла и сдвиги там по 4 разряда. Этот метод медленнее, чем тот, где таблица из 256 элементов, но экономит память (таблица всего 16*4 = 64 байта). Потратил полдня и нашел решение (очевидно как и вы - методом реверсного анализа). Сначала воспользовался алгоритмом, который сдвигает побитно. Посмотрел какое значение должно получаться после 4, 8, 12, 16, 20 сдвигов, записал. Потом стал смотреть (исходя из вашей формулы) что (какой элемент из 256-элементной таблицы) должно браться, чтобы на определенный входной ниббл (а их 16 вариантов) получить нужное значение. Потом осмыслил то, какие значение должны быть в этой маленькой таблице и в конце концов все заработало! Так что привожу этот пример, может быть кому то пригодится:
1
|
219 / 16 / 0
Регистрация: 15.08.2016
Сообщений: 39
|
||||||
13.12.2019, 09:27 [ТС] | 8 | |||||
Но оно есть в вашем ответе выше
0
|
13.12.2019, 09:27 | |
13.12.2019, 09:27 | |
Помогаю со студенческими работами здесь
8
Здравствуйте, форумчане... Реализовать симлекс метод табличным способом необходимо
Рекурсивный алгоритм crc32 нужно сделать алгоритм вычисления Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |