C# 如何为损坏的复制文件修复损坏的数据包?

C# 如何为损坏的复制文件修复损坏的数据包?,c#,copy,md5,crc32,C#,Copy,Md5,Crc32,问题在于如何修复,而不是如何复制 因此,如果我们在复制之前和之后复制了一个文件,并为此文件创建了一个HashMap(在C#中使用MD5或CRC32),那么我们可以在复制之后检查文件是否已完全复制且没有任何损坏 假设我们在这个复制的文件中发现了一个损坏包。 问题是:除了重新复制文件外,我们还可以做些什么,仅使用MD5或CRC32或C#中的任何其他技术修复损坏的数据包?否。您需要的是Reed Solomon代码,这是一种纠错代码。根据您添加的检查信息的数量,它可以纠正消息中数量有限的错误。这只有在错

问题在于如何修复,而不是如何复制

因此,如果我们在复制之前和之后复制了一个文件,并为此文件创建了一个HashMap(在C#中使用MD5或CRC32),那么我们可以在复制之后检查文件是否已完全复制且没有任何损坏

假设我们在这个复制的文件中发现了一个损坏包。
问题是:除了重新复制文件外,我们还可以做些什么,仅使用MD5或CRC32或C#中的任何其他技术修复损坏的数据包?

否。您需要的是Reed Solomon代码,这是一种纠错代码。根据您添加的检查信息的数量,它可以纠正消息中数量有限的错误。这只有在错误通道可能只引入少量错误时才有用


里德-所罗门(Reed-Solomon)码擅长纠正长时间突发的错误,这也是它们使CD成为可能的一部分。Reed Solomon代码可以纠正CD上的宏观划痕导致的突发错误,其中编码位是微观的。

正如Mark Adler所说,最好使用Reed Solomon修复损坏的包装。
另外,系统方法
File.Copy()
已经在检查复制的包中是否有任何损坏。

否,crc不是一个纠错号,它只告诉您有问题,而不是问题所在。md5也差不多。您不必重新发送整个文件,只需重新发送数据包即可。TCP为您做了很多这方面的工作。除了TCP之外,还有其他方法可以修复它吗?最简单的方法是再次请求数据包,ECC可能能够修复小错误,但只是不包含足够的信息来重建整个数据包(除非非常小)。您说您能够“找到”损坏的数据包。因此,您已经有了一些错误检测代码(不是ECC!),例如奇偶校验。因此,您可以识别并重新传输丢失的数据包。如果您不喜欢TCP,您不需要使用它,您也可以通过更简单的协议进行重传。无需重新传输,原则上您只能重建丢失的数据:假设您的散列是加密安全的,您可以在数据包中使用丢失数据的所有可能位组合重试,直到文件的散列匹配。这将花费永远的时间!