2012-02-14 3 views
0

Я унаследовал приложение Delphi, которое мне нужно преобразовать в приложение C# на моей работе.Delphi-программа, генерирующая некорректный CRC16, хочет реплицировать поведение в C#

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

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

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

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

1] Постарайтесь выяснить, какой вид CRC она порождающих

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

Я пробовал и так и не удалось несчастно.

-

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

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

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

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

-

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

Благодаря

+0

Мы знаем, о какой версии Delphi мы говорим? Если я правильно понял, Delphi не получал полную поддержку Unicode до 2009 года; хотя эта разница не зависит от характера данных, которые вы пытаетесь выполнить в CRC ... –

+0

Данные регистрации никогда не включают символы, отличные от A-Z, 1-9. Так что это не проблема. – NoPyGod

+0

Я только что заметил это сообщение в форуме на MSDN; он имеет особое отношение к объектам, которые возвращают строку delphi, что здесь возможно. http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/d9296998-9729-45c3-89e9-577c618e4cbe/ –

ответ

3

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

1. В настоящий момент напишите обертку «небезопасный/pInvoke» и вызовите родную dll.

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

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

+0

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

+0

Проверьте ответ на свой ответ, я затронул эти проблемы. Если я смогу это сделать, используя Pinvoke, я буду счастлив. – NoPyGod

+0

Действительно; сюжет сгущается! Если вы счастливы проглотить эти проблемы, то Тим и Шон абсолютно верны. P/Invoke - это путь. –

0

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

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

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

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

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

+0

Являются ли данные Text, XML, Binary или что-то еще? –

+0

Обратная совместимость важна. У нас есть база данных, полная серийных ключей для нашего приложения, которая развернута на сотнях компьютеров по всей стране. Выполняя побитовые операции с серийным номером, мы можем видеть, какие функции нашего приложения включены для клиента. Это было бы очень просто, НО, прежде чем мы сможем выполнить эти побитовые операции, нам нужно DES декодировать серию, и для этого нам нужно получить контрольную сумму CRC16 нескольких регистрационных данных пользователя и использовать их в качестве декодирования ключ. – NoPyGod

+0

Говоря о том, что мы пересматриваем нашу систему регистрации в течение следующих 6 месяцев и переходим к подходу к онлайн-проверке. Когда мы это сделаем, я, конечно, не буду использовать ту же процедуру CRC. Но для старых клиентов (многие из них никогда не будут перемещены в новую систему, потому что они просто откажутся), они будут продолжать использовать старую систему. – NoPyGod

3

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

+0

Я пробовал, и я продолжаю пытаться. – NoPyGod

+0

Ваша DLL предоставляет 3 метода CRC_16, CRC_32 и CRC_CCITT как для фактического синтаксиса обертки pinvoke, я мог догадаться, но я не знаю, что такое CRC_MAKE (или если происходит какое-то неявное кастинг). Что в CRC.INC? –

+0

CRC.INC определяет вызовы CRC.DLL. Не спрашивайте меня, как это работает, Delphi для меня новичок. CRC_MAKE определяется в верхней части CRC.INC, вам просто нужно передать 0 для этого. – NoPyGod