Delphi программа генерирует некорректный CRC16, хочет повторить поведение в C # - PullRequest
0 голосов
/ 14 февраля 2012

Я унаследовал приложение Delphi, которое мне нужно преобразовать в приложение C # на моей работе.

Одна часть использует то, что должно быть функцией CRC16 во внешней DLL, чтобы создать контрольную сумму для некоторыхданные.Проблема в том, что генерируемый CRC не соответствует ни одному из CRC, которые мне удалось сгенерировать в другом месте.

Я пробовал около 10 различных фрагментов кода CRC, которые я нашел в Интернете, и пробовал несколько онлайн-генераторов.,Генерируемые мной CRC совпадают с генерируемыми в сети, например: -

http://www.lammertbies.nl/comm/info/crc-calculation.html

Так что теперь я могу только сделать вывод, что приложение Delphi не генерирует действительную контрольную сумму CRC16.Это оставляет мне два варианта

1] Попытаться выяснить, какой тип CRC он генерирует

2] Каким-то образом вызвать функции в DLL изнутри C #

Iпробовал оба и с треском провалился.

-

Весь источник находится на github -

https://github.com/delphi2sharp/delphisharp/blob/master/CRC16Test/CRC16Test/Program.cs

https://github.com/delphi2sharp/delphisharp/blob/master/DelphiCRC16Test/Unit1.pas

и CRC.DLLтакже там.

-

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 3 ]

3 голосов
/ 14 февраля 2012

Я думаю, что вам нужен двухфазный подход.

1. / На данный момент напишите обертку «unsafe / pInvoke» и вызовите нативный dll.

2. / Как толькоПриложение Delphi заменяется, и вы управляете кодировкой, а также декодированием, пишете более стандартную функцию CRC.

Вызов нативной DLL не так уж и сложен, взгляните на некоторые примеры на pinvoke.net.

3 голосов
/ 14 февраля 2012

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

0 голосов
/ 14 февраля 2012

Во-первых, я прошу прощения за размещение этого в качестве ответа; это просто слишком громоздко для комментария.

У вас нет источника для CRC.Dll?

Глядя на это, он выглядит как другой файл на основе Delphi, который опирается как минимум на Kernel32.dll; кроме того, что я не могу сказать на этом Mac. Наблюдение состоит в том, что это различие может быть связано с различиями Unicode между Delphi и .Net.

Если вы портируете это на .Net, есть ли какая-то причина, по которой вы не можете просто заменить этот CRC известным хорошим решением или вам нужно сохранить некоторую обратную совместимость? Если так; Вы не можете использовать общий код CRC в .Net и выполнить пакетное обновление устаревших компонентов?

Если нет; тогда, возможно, ответ заключается в том, чтобы избавиться от этого сделанного на заказ генератора CRC и использовать то, что подтверждает ваши ожидания и обеспечивает повторяемые точные результаты.

...