Delphi程序生成错误的CRC16,想要在C#中复制行为

时间:2012-02-14 01:58:39

标签: c# delphi dll crc

我继承了Delphi应用程序,我需要在我的工作中将其转换为C#应用程序。

一部分使用外部dll中应该是CRC16函数的内容来为某些数据创建校验和。问题在于,生成的CRC与我在其他地方设法生成的任何CRC都不匹配。

我尝试了大约10种不同的CRC代码片段,我在网上找到它们,并尝试了几种在线生成器。我生成的CRC与我在线生成的CRC匹配,例如在 -

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

所以我现在唯一的结论是Delphi应用程序没有生成有效的CRC16校验和。这给我留下了两个选择

1]尝试确定它正在生成哪种CRC

2]以某种方式从C#中调用DLL中的函数

我已经尝试过两次并且悲惨地失败了。

-

所有来源都在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 个答案:

答案 0 :(得分:3)

我认为您需要采用两阶段方法。

1. /暂时写一个“unsafe / pInvoke”包装并调用本机dll。

2. /更换Delphi应用程序并控制编码和解码后,编写更标准的CRC功能。

调用本机DLL并不困难,请查看pinvoke.net上的一些示例。

答案 1 :(得分:3)

如果您需要向后兼容,为什么不使用原始本机dll的pInvoke包装。

答案 2 :(得分:0)

首先,我为发布这个作为答案而道歉;发表评论真是太笨重了。

你没有CRC.Dll的来源吗?

看着它,看起来就像另一个基于Delphi的文件,它依赖于至少Kernel32.dll;另外,我不能在这台Mac上说。 一个观察结果是,这种差异可能是由于Delphi和.Net之间的Unicode差异造成的。

如果您将此移植到.Net,是否有任何理由不能用已知良好的解决方案替换CRC或者您是否必须保留一些向后兼容性? 如果是这样;您是否可以在.Net中使用通用CRC代码并对遗留内容进行批量更新?

如果没有;那么也许答案就是抛弃这个定制的CRC生成器并使用能够验证您期望的东西并提供可重复的准确结果。