dev*_*os1 9 .net c# comparison image file
我有一个MemoryStream包含PNG编码图像的字节,并想检查磁盘上的目录中是否有完全相同的图像数据.第一个显而易见的步骤是只查找与确切长度匹配的文件,但在此之后我想知道将内存与文件进行比较的最有效方法是什么.我在使用溪流时不是很有经验.
我对此事有几点想法:
首先,如果我能得到文件的哈希码,那么(可能)比较哈希码而不是图像的每个字节都会更有效.同样,我可以比较图像的一些字节,给出"足够接近"的答案.
然后当然我可以比较整个流,但我不知道会有多快.
将MemoryStream与文件进行比较的最佳方法是什么?for循环中逐字节的字节?
Cod*_*313 21
另一种方案:
private static bool CompareMemoryStreams(MemoryStream ms1, MemoryStream ms2)
{
if (ms1.Length != ms2.Length)
return false;
ms1.Position = 0;
ms2.Position = 0;
var msArray1 = ms1.ToArray();
var msArray2 = ms2.ToArray();
return msArray1.SequenceEqual(msArray2);
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*cek 11
首先,获取两个流的哈希码无济于事 - 计算哈希码时,您需要读取整个内容并在读取时执行一些简单的计算.如果您逐个字节地比较文件或使用缓冲区,那么您可以提前停止(在找到前两个字节/块之后)不匹配.
但是,如果你需要比较MemoryStream多个文件,这种方法是有意义的,因为那时你需要循环MemoryStream一次(计算哈希码)并循环遍历所有文件.
在任何情况下,您都必须编写代码来读取整个文件.正如您所提到的,这可以是逐字节或使用缓冲区完成的.将数据读入缓冲区是一个好主意,因为从HDD读取时可能更有效(例如读取1kB缓冲区).此外,BeginRead如果需要并行处理多个文件,可以使用异步方法.
摘要:
BeginRead如果需要并行处理多个文件,请异步使用上述步骤.
| 归档时间: |
|
| 查看次数: |
14377 次 |
| 最近记录: |