我尝试将加载到Memorystream中的前16个字节读取为TBytes。此ReadBuffer methot引发访问冲突异常。
我想从文件中加载加密的数据。前16个字节是用于创建文件的密码的MD5哈希。因此,加载后我要做的第一件事是检查提供的密码是否与编码的保存密码匹配。为此,我重新引入了LoadFromFile方法作为函数,返回了加载代码。 现在进行测试,我的文件仅包含16个字节的密码。 我检查了是否正确创建了MemoryStream。查看局部变量,我发现确实有16个字节被加载到Stream中。
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方法)。
有人对引发此异常的原因以及如何解决此问题有线索吗?
答案 0 :(得分:7)
PwdMD5默认为零。 IOW,您需要调用SetLength(PwdMD5,16)以便在读取文件时留出一定的空间来存放字节。