C#parchive/quickpar/par2修复实施?
我正在编写一个C#应用程序,它需要能够使用par2奇偶校验文件修复一组文件。 对于C++,有很多可以找到的,但是对于C i,我找不到本机实现。C#parchive/quickpar/par2修复实施?,c#,repair,C#,Repair,我正在编写一个C#应用程序,它需要能够使用par2奇偶校验文件修复一组文件。 对于C++,有很多可以找到的,但是对于C i,我找不到本机实现。 一个选项是使用C++中的C++ DLL, 但我不想这样做,因为在x64应用程序中不可能使用32位dll,所以我会将我的应用程序限制为32位模式 另一个选项是在后台执行par2cmdline, 但我更希望对过程有更多的控制(进度、取消等) 有人知道一个本地C#实现可以使用par2集修复文件吗?这不是一个直接的答案,但我认为有一种方法可以将32位dll加载到
一个选项是使用C++中的C++ DLL, 但我不想这样做,因为在x64应用程序中不可能使用32位dll,所以我会将我的应用程序限制为32位模式
另一个选项是在后台执行par2cmdline, 但我更希望对过程有更多的控制(进度、取消等)有人知道一个本地C#实现可以使用par2集修复文件吗?这不是一个直接的答案,但我认为有一种方法可以将32位dll加载到64位应用程序中: 从文章中: 此解决方案需要额外的工作,因为必须创建加载32位DLL并公开其API的32位代理进程。此外,64位端还需要进行一些更改,因为使用者必须使用IPC技术之一,而不是直接访问32位DLL。值得注意的是,在极端情况下,这项额外工作可以与从头开始开发64位版本的32位DLL的工作相媲美 降低这些成本的一种可能方法是实现一个64位包装器DLL,它公开与原始32位DLL相同的函数、参数、类型等。然后,此包装器DLL可以对原始32位DLL进行基于IPC的调用,该DLL已加载到代理进程中
不久前我做过类似的事情。如果你看一下par2的源代码,它不是微不足道的。你可以很容易地把它移植到c#。可悲的是,所有的努力都会让你付出高昂的性能代价(如果你不相信我,试试看) 我最终通过CreateProcess调用了par2可执行文件。您可以获得stdin、stdout和strerr的句柄。因为可执行文件是一个控制台应用程序,所以您可以解析输出以获得进度。如果要“取消”该操作,可以随时终止该进程 这是一种草率的方法
“正确”的方法是将par2源代码移植到64位dll(出于性能原因,请坚持使用非托管C/C++dll)。是否要坚持使用PAR本身?我有一个完全本地的Reed/Solomon实现,如果有帮助的话我会发布(PAR基于的匹配),但是我没有任何关于所有文件处理和分解的东西 我的代码是Stream的一个实现,并生成一个包含所有纠错数据的字符串。然后,您可以损坏该数据并将其发送回,it系统将自动恢复该数据。我只想发布它,但它很长,我太懒了,不想写一篇博文并链接到它
为了使这项工作像PAR一样,你必须把它分解成文件,然后构建一个系统,可以识别缺失的卷并“添加”所有缺失数据的损坏数据(数学不能处理丢失的数据,只损坏)。
另外,作为性能方面的说明,为其构建的系统相当“突发”,它一次可以接收到大量100k流,但也有很长的等待时间。C版本的数学运算速度比纯C版本快约6%。如果我只使用不间断加载进行性能测试,C#的运行速度会慢1-2%。根据我的经验,大多数C到C的数学转换都有相同的性能结果 谢谢!这是一种选择,尽管正如文章所提到的,它可能与完全用C#从头开始编写par2实现一样多。这是我不想从头开始编写的一件事……永远不会!:-)如果您声称知道将其移植到C#会导致性能大幅下降,请问您是如何知道的?你真的把它移植了吗,还是只是一个有根据的猜测?我不确定把它移植到C#会不会导致性能的大幅下降,只是我不想把时间花在这上面:)我喜欢这样的说法:“这不是小事。你可以毫不费力地把它移植到C#上。如果你能把它贴出来,我会非常感激,即使它只是作为参考。它可能对其他人也有用!好的,我会在今天下班后找到它,然后编辑这篇文章,在哪里可以找到代码。