9

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

一种选择是使用来自 C# 的 C++ DLL,但我宁愿不这样做,因为不可能在 x64 应用程序中使用 32 位 dll,所以我将我的应用程序限制为 32 位模式。

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

有谁知道将使用 par2 集修复文件的本机 C# 实现?

4

3 回答 3

1

你想坚持自己的PAR吗?我有一个完全原生的 Reed/Solomon 实现,如果它有帮助(PAR 所基于的匹配),我会发布,但我没有任何文件处理和分解的东西。

我的代码是 Stream 的一个实现,并生成一个包含所有纠错数据的字符串。然后,您可以破坏该数据并将其发回,系统将自动恢复它。我只想发布它,但它很,我懒得写博客文章并链接到它。

要使这项工作像 PAR 一样,您必须将其分解为文件,然后构建一个系统,该系统可以识别丢失的卷并为所有丢失的数据“添加”损坏的数据(数学无法处理丢失的数据,只能处理损坏的数据)。

此外,作为性能说明,此系统构建的系统相当“突发”,它一次会获得大量 100k 流,但也需要长时间等待什么都不做。C# 版本的数学运算比纯 C 版本快约 6%。如果我只使用不间断负载进行性能测试,C# 的运行速度会慢 1-2%。根据我的经验,大多数 C 到 C# 数学转换具有相同的性能结果。

于 2009-05-20T05:00:39.020 回答
0

这不是一个直接的答案,但我认为有一种方法可以将 32 位 dll 加载到 64 位应用程序中:

http://dnjonline.com/article.aspx?ID=jun07_access3264

来自文章:

此解决方案需要额外的工作,因为必须创建加载 32 位 DLL 并公开其 API 的 32 位代理进程。此外,由于消费者必须使用其中一种 IPC 技术,而不是直接访问 32 位 DLL,因此需要在 64 位端进行一些更改。值得注意的是,在极端情况下,这项额外的工作可以与从头开始开发 64 位版本的 32 位 DLL 所涉及的工作相媲美。

降低这些成本的一种可能方法是实现一个 64 位包装 DLL,它公开与原始 32 位 DLL 相同的函数、参数、类型等。然后,此包装 DLL 可以对已加载到代理进程中的原始 32 位 DLL 进行基于 IPC 的调用。

于 2009-05-19T08:41:38.323 回答
0

不久前我正在做这样的事情。如果您查看 par2 源代码,这并非易事。您可能可以毫不费力地将其移植到 c#。可悲的是,所有付出的努力都会在性能上付出高昂的代价(如果您不相信我,请尝试一下)。

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

这是一种草率的方法。

“正确”的方法是采用 par2 源并将其移植到 64 位 dll(出于性能原因坚持使用非托管 C/C++ DLL)。

于 2009-05-19T14:06:29.900 回答