delphi - 写入后 TFileStream 的 MD5 哈希不正确
问题描述
我正在使用以下方式下载文件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
为什么会这样?
解决方案
在计算哈希之前,需要将 Filestream 的 Position 设置为零。
代码应如下所示。
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;
推荐阅读
- javascript - Javascript - 等待数组完成填充
- python - PyCharm 远程部署:未保存用户名
- ssl - 无法将 .CER 文件转换为 .PEM
- python - 从文本文件中读取整数,如果整数不在特定范围内,则激活 GPIO 引脚
- c++ - 如何在 C++ 上打印附加详细信息?
- c# - JSON文件中的Unity阿拉伯文本
- java - MVC SPRING HTTP 状态 500 - servlet mvc-dispatcher 的 Servlet.init() 抛出异常
- python - python2.x / 3.x中函数调用过长如何缩进
- excel - 根据第一列的值将列的值从一个工作表复制到另一个工作表
- java - 新机器上的多个 Java 可执行文件