TMemoryStream.ReadBuffer генерирует исключение нарушения прав доступа - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь прочитать первые 16 байтов, которые загружены в поток памяти в ТБ.Этот метод ReadBuffer генерирует исключение нарушения прав доступа.

Я хочу загрузить зашифрованные данные из файла.Первые 16 байтов являются MD5-хэшем пароля, использованного для создания файла.Поэтому первое, что я хочу сделать после загрузки, это проверить, совпадает ли предоставленный пароль с зашифрованным.Для этого я снова ввел метод LoadFromFile как функцию, возвращающую код загрузки.Для тестирования сейчас мой файл содержит только 16 байтов для пароля.Я проверил, правильно ли создан MemoryStream.Глядя в локальные переменные, я вижу, что в поток действительно загружено 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;

Я также пробовал другие функции чтения, они все выдают одну и ту же ошибку (что вполне понятно, поскольку все они в конечном итогевызовите метод TStream.Read).

Кто-нибудь знает, почему выбрасывается это исключение и что я могу сделать, чтобы решить эту проблему?

1 Ответ

7 голосов
/ 25 сентября 2019

PwdMD5 по умолчанию равен нулю.IOW, вам нужно вызвать SetLength (PwdMD5, 16), чтобы иметь место для байтов, которые нужно прочитать при чтении файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...