写入后 TFileStream 的 MD5 散列不正确
MD5 hash of TFileStream is incorrect after write
我正在使用 TIdHttp
下载文件,然后使用 TIdHashMessageDigest5
检查其 MD5 散列,如下所示:
http := TIdHttp.Create();
fs := TFileStream.Create('mydownload.bin', fmCreate);
md5 := TIdHashMessageDigest5.Create;
http.Get(url, fs);
http.Disconnect;
md5Hex := md5.HashStreamAsHex(fs).ToLower;
// expected: 39704b0e2c1d704906d16c42260f45ef
// actual: d41d8cd98f00b204e9800998ecf8427e
但是,如果我关闭 TFileStream
并重新打开它,MD5 是预期的:
http := TIdHttp.Create();
fs := TFileStream.Create('mydownload.bin', fmCreate);
md5 := TIdHashMessageDigest5.Create;
http.Get(url, fs);
http.Disconnect;
fs.Free;
fs := TFileStream.Create('mydownload.bin', fmOpenRead);
md5Hex := md5.HashStreamAsHex(fs).ToLower;
// expected: 39704b0e2c1d704906d16c42260f45ef
// actual: 39704b0e2c1d704906d16c42260f45ef
为什么会这样?
在计算哈希值之前需要将文件流的位置设置为零。
代码应如下所示。
http := TIdHttp.Create();
fs := TFileStream.Create('mydownload.bin', fmCreate);
md5 := TIdHashMessageDigest5.Create;
http.Get(url, fs);
http.Disconnect;
fs.Position := 0;
md5Hex := md5.HashStreamAsHex(fs).ToLower;
我正在使用 TIdHttp
下载文件,然后使用 TIdHashMessageDigest5
检查其 MD5 散列,如下所示:
http := TIdHttp.Create();
fs := TFileStream.Create('mydownload.bin', fmCreate);
md5 := TIdHashMessageDigest5.Create;
http.Get(url, fs);
http.Disconnect;
md5Hex := md5.HashStreamAsHex(fs).ToLower;
// expected: 39704b0e2c1d704906d16c42260f45ef
// actual: d41d8cd98f00b204e9800998ecf8427e
但是,如果我关闭 TFileStream
并重新打开它,MD5 是预期的:
http := TIdHttp.Create();
fs := TFileStream.Create('mydownload.bin', fmCreate);
md5 := TIdHashMessageDigest5.Create;
http.Get(url, fs);
http.Disconnect;
fs.Free;
fs := TFileStream.Create('mydownload.bin', fmOpenRead);
md5Hex := md5.HashStreamAsHex(fs).ToLower;
// expected: 39704b0e2c1d704906d16c42260f45ef
// actual: 39704b0e2c1d704906d16c42260f45ef
为什么会这样?
在计算哈希值之前需要将文件流的位置设置为零。
代码应如下所示。
http := TIdHttp.Create();
fs := TFileStream.Create('mydownload.bin', fmCreate);
md5 := TIdHashMessageDigest5.Create;
http.Get(url, fs);
http.Disconnect;
fs.Position := 0;
md5Hex := md5.HashStreamAsHex(fs).ToLower;