我正在写一个需要能够使用par2奇偶校验文件修复一组文件的C#应用程序。对于C++,有很多可以做到这一点的东西,但是对于C#,我找不到一个本机实现。
一种选择是使用C#的C++动态链接库,但我不愿意这样做,因为在x64应用程序中不可能使用32位动态链接库,所以我会将我的应用程序限制为32位模式。
另一种选择是在后台外壳执行par2cmdline,但我更愿意对进程有更多的控制(进度、取消等)。
有谁知道可以使用par2集修复文件的原生C#实现吗?
发布于 2009-05-20 05:00:39
您想继续使用PARs本身吗?我有一个完全原生的Reed/Solomon实现,如果它有帮助的话我会发布它( PARs所基于的匹配),但我没有任何关于所有文件处理和分解的东西。
我的代码是Stream的一个实现,它生成一个包含所有纠错数据的字符串。然后,您可以损坏该数据并将其发送回去,系统将自动恢复该数据。我只想把它贴出来,但它太长了,而且我太懒了,不想写一篇博客文章并链接到它。
为了让它像解析一样工作,你必须把它分解成文件,然后建立一个系统,可以识别丢失的卷,并为所有丢失的数据“添加”损坏的数据(数学不能处理丢失的数据,只能处理损坏的数据)。
此外,作为性能的说明,这个系统是相当“突发性”的,它将在同一时间获得大量的100k流,但也有很长的等待什么也不做。数学的C#版本比纯C版本快了大约6%。如果我仅使用非停止加载进行性能测试,C#的运行速度会慢1-2%。根据我的经验,大多数C到C#数学转换都有相同的性能结果。
发布于 2009-05-19 08:41:38
这不是一个直接的答案,但我认为有一种方法可以将32位dll加载到64位应用程序中:
http://dnjonline.com/article.aspx?ID=jun07_access3264
摘自文章:
此解决方案需要额外的工作,因为必须创建加载32位DLL并公开其API的32位代理进程。此外,由于使用者必须使用其中一种IPC技术,而不是直接访问32位DLL,因此在64位端需要进行一些更改。值得注意的是,在极端情况下,这项额外的工作可以与从头开始开发32位DLL的64位版本所涉及的工作相媲美。
降低这些成本的一种可能方式是实现64位包装器的DLL,该DLL公开与原始32位DLL相同的函数、参数、类型等。然后,此包装器DLL可以对已加载到代理进程中的原始32位DLL进行基于IPC的调用。
发布于 2009-05-19 14:06:30
不久前我就做过这样的事情。如果你看一下par2源代码,就会发现这并不是一件微不足道的事情。您可能会毫不费力地将其移植到c#。可悲的是,所有的努力都会让你在性能上付出高昂的代价(如果你不相信我的话,试试吧)。
我最终通过CreateProcess调用了par2可执行文件。您可以获得stdin、stdout和strerr的句柄。因为可执行文件是一个控制台应用程序,所以您可以解析输出以获取进度。如果你想“取消”这个操作,你可以随时终止这个进程。
这是一种草率的方法。
“正确”的方法是获取par2源代码并将其移植到64位动态链接库(出于性能原因,坚持使用非托管C/C++动态链接库)。
https://stackoverflow.com/questions/881546
复制相似问题