TMemoryStream.ReadBuffer 引发访问冲突异常



我尝试将加载到内存流中的前 16 个字节读取到 TBytes。此 ReadBuffer methot 引发访问冲突异常。

我想从文件加载加密数据。前 16 个字节是用于创建文件的密码的 MD5 哈希。因此,加载后我想做的第一件事是检查提供的密码是否与编码保存的密码匹配。为此,我将 LoadFromFile 方法重新引入为函数,并返回加载代码。 现在进行测试,我的文件仅包含密码的 16 个字节。 我检查了内存流是否正确创建,确实如此。查看局部变量,我看到确实有 16 个字节加载到流中。

TEncMemoryStream = class(TMemoryStream)
strict private
PwdMD5: TBytes;
.
.
public
constructor Create;
destructor Destroy;override;
function LoadFromFile(Filename: String;PassWord:String): 
TLoadResult;reintroduce;
.
.
function TEncMemoryStream.LoadFromFile(Filename: String;PassWord:String): TLoadResult;
begin
Result := lrLoaded;
try
inherited LoadFromFile(Filename);
ReadBuffer(PwdMD5,16);      // <----- here the exception is thrown
except
Result := lrFailed;
end;
if Result = lrLoaded then
if not CheckPassWord(PassWord) then begin
Clear;
Result := lrWrongPwd;
end
end;

我也尝试了其他 Read 函数,它们都抛出相同的错误(这是完全有意义的,因为它们最终都调用了 TStream.Read 方法(。

有人知道为什么抛出此异常以及我可以做些什么来解决这个问题吗?

默认情况下,PwdMD5 为 nil。IOW,您需要调用 SetLength(PwdMD5, 16(,以便在读取文件时有地方放置字节。

最新更新