【发布时间】:2015-10-29 07:54:22
【问题描述】:
我正在将文件 uloading 到 ftp 并且需要确保文件被正确传输。为此,我随后重新下载文件并检查文件是否与原始本地文件内容相同。为此,我以小块的形式读取每个文件并在内容上生成 MD5 和。
尽管 MD5 可以表示的内容有限,但我认为就查看文件是否存在差异而言(通常最大为 2 MB)就足够了。现在,虽然当我为每个流(一个是下载流,另一个是本地文件读取流)生成 MD5 时,我遇到了一个问题,即两者的 MD5 不同(尽管前几个块在MD5。并且文件本身是一个 zip 文件,可以在 ftp 服务器上毫无问题地提取)。
我想知道的是:我的想法本身是否有错误?或者我的代码有错误吗?或者为什么内容看起来不同?
电话:
ftpMD5 = GeneriereMD5FuerStream(ftpAnsuchen.GetResponse().GetResponseStream());
lokalMD5 = GeneriereMD5FuerStream((new FileInfo(lokaleDateiPfad)).OpenRead());
if (ftpMD5.Equals(lokalMD5) == false)
{
throw exception "Different";
}
方法代码:
private string GeneriereMD5FuerStream(Stream leseStream)
{
string md5String = String.Empty;
byte[] leseBuffer = new byte[2048];
int bytesGelesen = 0;
MD5 md5Converter = MD5.Create();
bytesGelesen = leseStream.Read(leseBuffer, 0, leseBuffer.Length);
md5String = BitConverter.ToString(md5Converter.ComputeHash(Encoding.Default.GetBytes(md5String + BitConverter.ToString(md5Converter.ComputeHash(leseBuffer)))));
while (bytesGelesen > 0)
{
bytesGelesen = leseStream.Read(leseBuffer, 0, leseBuffer.Length);
if (bytesGelesen > 0)
{
md5String = BitConverter.ToString(md5Converter.ComputeHash(Encoding.Default.GetBytes(md5String + BitConverter.ToString(md5Converter.ComputeHash(leseBuffer)))));
}
}
return md5String;
}
【问题讨论】:
-
同时我通过使用 return BitConverter.ToString((MD5.Create()).ComputeHash(leseStream));但我仍然会对手动创建 MD5 失败的原因感兴趣。
-
是的,您计算哈希的方式意味着哈希将根据块的大小而有所不同。