首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# parchive / quickpar / par2修复实现?

C# parchive / quickpar / par2修复实现?
EN

Stack Overflow用户
提问于 2009-05-19 08:19:58
回答 3查看 2.9K关注 0票数 9

我正在写一个需要能够使用par2奇偶校验文件修复一组文件的C#应用程序。对于C++,有很多可以做到这一点的东西,但是对于C#,我找不到一个本机实现。

一种选择是使用C#的C++动态链接库,但我不愿意这样做,因为在x64应用程序中不可能使用32位动态链接库,所以我会将我的应用程序限制为32位模式。

另一种选择是在后台外壳执行par2cmdline,但我更愿意对进程有更多的控制(进度、取消等)。

有谁知道可以使用par2集修复文件的原生C#实现吗?

EN

回答 3

Stack Overflow用户

发布于 2009-05-20 05:00:39

您想继续使用PARs本身吗?我有一个完全原生的Reed/Solomon实现,如果它有帮助的话我会发布它( PARs所基于的匹配),但我没有任何关于所有文件处理和分解的东西。

我的代码是Stream的一个实现,它生成一个包含所有纠错数据的字符串。然后,您可以损坏该数据并将其发送回去,系统将自动恢复该数据。我只想把它贴出来,但它太长了,而且我太懒了,不想写一篇博客文章并链接到它。

为了让它像解析一样工作,你必须把它分解成文件,然后建立一个系统,可以识别丢失的卷,并为所有丢失的数据“添加”损坏的数据(数学不能处理丢失的数据,只能处理损坏的数据)。

此外,作为性能的说明,这个系统是相当“突发性”的,它将在同一时间获得大量的100k流,但也有很长的等待什么也不做。数学的C#版本比纯C版本快了大约6%。如果我仅使用非停止加载进行性能测试,C#的运行速度会慢1-2%。根据我的经验,大多数C到C#数学转换都有相同的性能结果。

票数 1
EN

Stack Overflow用户

发布于 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的调用。

票数 0
EN

Stack Overflow用户

发布于 2009-05-19 14:06:30

不久前我就做过这样的事情。如果你看一下par2源代码,就会发现这并不是一件微不足道的事情。您可能会毫不费力地将其移植到c#。可悲的是,所有的努力都会让你在性能上付出高昂的代价(如果你不相信我的话,试试吧)。

我最终通过CreateProcess调用了par2可执行文件。您可以获得stdin、stdout和strerr的句柄。因为可执行文件是一个控制台应用程序,所以您可以解析输出以获取进度。如果你想“取消”这个操作,你可以随时终止这个进程。

这是一种草率的方法。

“正确”的方法是获取par2源代码并将其移植到64位动态链接库(出于性能原因,坚持使用非托管C/C++动态链接库)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/881546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档