Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Delphi程序生成错误的CRC16,希望在C中复制行为#_C#_Delphi_Dll_Crc - Fatal编程技术网

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

C# Delphi程序生成错误的CRC16,希望在C中复制行为#,c#,delphi,dll,crc,C#,Delphi,Dll,Crc,我继承了一个Delphi应用程序,在工作中需要将其转换为C#应用程序 一部分使用外部dll中的CRC16函数为某些数据创建校验和。问题是,生成的CRC与我在别处设法生成的任何CRC都不匹配 我在网上找到了大约10个不同的CRC代码片段,并尝试了几个在线生成器。我生成的CRC与我在线生成的CRC匹配,例如在- 所以我现在唯一的结论是Delphi应用程序没有生成有效的CRC16校验和。这让我有两个选择 1] 尝试找出它正在生成哪种CRC 2] 以某种方式从C内部调用DLL中的函数# 我两次都试过了

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

一部分使用外部dll中的CRC16函数为某些数据创建校验和。问题是,生成的CRC与我在别处设法生成的任何CRC都不匹配

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

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

1] 尝试找出它正在生成哪种CRC

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

我两次都试过了,但都失败了

--

所有源代码都在github上-

而且CRC.DLL也在那里

--

任何帮助都将不胜感激


谢谢

首先,我很抱歉将此作为回答;这太难理解了,不能写进评论里

你没有CRC.Dll的源代码吗

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

如果你要把它移植到.Net,有什么原因不能用一个好的解决方案替换CRC,或者你必须保留一些向后的兼容性吗? 若有,;你不能在.Net中使用通用的CRC代码,并对遗留的东西进行批量更新吗


若否,;那么,也许答案是扔掉这个定制的CRC生成器,使用一些能够验证您的期望并提供可重复的准确结果的东西。

首先,我很抱歉将此作为一个答案发布;这太难理解了,不能写进评论里

你没有CRC.Dll的源代码吗

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

如果你要把它移植到.Net,有什么原因不能用一个好的解决方案替换CRC,或者你必须保留一些向后的兼容性吗? 若有,;你不能在.Net中使用通用的CRC代码,并对遗留的东西进行批量更新吗


若否,;然后,也许答案是抛弃这个定制的CRC生成器,使用一些能够验证您的期望并提供可重复的准确结果的东西。

我认为您需要一种两阶段方法

1./目前,编写一个“不安全/pInvoke”包装器并调用本机dll

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


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

我认为您需要一种两阶段方法

1./目前,编写一个“不安全/pInvoke”包装器并调用本机dll

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


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

如果需要向后兼容,为什么不使用原始本机DLL的pinvoke包装器。

如果需要向后兼容,为什么不使用原始本机DLL的pinvoke包装器。

是数据文本,XML,二进制还是其他?向后兼容是必不可少的。我们有一个数据库,里面有我们应用程序的串行密钥,部署在全国数百台计算机上。通过对串行数据执行逐位操作,我们可以看到为客户启用了应用程序的哪些功能。这将是非常简单的,但是,在我们可以执行这些按位操作之前,我们需要对串行进行DES解码,为了做到这一点,我们需要获得几个用户注册详细信息的CRC16校验和,并将其用作解码密钥。在说,我们将在接下来的6个月内对我们的注册系统进行大修,并采用在线验证的方式。当我们这样做时,我肯定不会使用相同的CRC例程。但是对于遗留客户端(他们中的许多人永远不会被移动到新系统,因为他们会简单地拒绝),他们将继续使用旧系统;安全的重构和批量更新可能是最明智的选择;由于编组差异和您无法知道为什么此CRC dll没有创建标准结果;无法知道通过C#平台调用实例化此DLL是否返回正确的结果。。。。正如Russ所建议的,但也许新的CRC有一个额外的列-即使看大量数据,你的眼睛也会看到常识所没有的东西,即两个数字之间的一个共同模式,这可能有助于确定最初的CRC实现在哪里执行得不好-然后你可以添加“错误”为了实现好,瞧,在C语言中有一个实现差的CRC方法#数据是文本、XML、二进制还是其他?向后兼容性是必不可少的。我们有一个数据库,里面有我们应用程序的串行密钥,部署在全国数百台计算机上。通过对串行数据执行逐位操作,我们可以看到为客户启用了应用程序的哪些功能。这将是非常简单的,但是,在我们可以执行这些按位操作之前,我们需要对序列进行DES解码,为了做到这一点,我们需要获得几个用户注册细节的CRC16校验和,并将它们用作解码密钥