Delphi 10.3: Проблема с Blob при преобразовании в строку - PullRequest
0 голосов
/ 06 мая 2020

Я столкнулся с проблемой, когда мы извлекаем данные архива (данные zip) в виде строки из большого двоичного объекта. Строка отображается в виде двухбайтовой строки (например, 'P' # 0'K '# 0 # 3 #), и, следовательно, zipforge, который мы используем для извлечения, завершается ошибкой архива: 0035. Итак, чтобы решить эту проблему, я попытался получить данные, используя следующий фрагмент кода (найденный в stackoverflow), и я получаю однобайтовую строку, и я могу извлечь данные.

      bStream := fld.Dataset.CreateBlobStream(fld, bmRead);
      try
        SetLength(BlobResult, bStream.Size);
        bStream.Read(BlobResult[1], bStream.Size);
      finally
        bStream.Free;
      end;

Но теперь, если применить приведенный выше фрагмент кода в blob, созданном в Delphi 2007, то я получаю значение мусора и, следовательно, не могу извлечь данные. В этом случае Blob.asString выглядит хорошо, и извлечение работает нормально.

Я хотел бы спросить, как безопасно получить данные blob в виде строки, чтобы я мог извлечь их без каких-либо проблем.

Edit: - Я редактирую этот вопрос, чтобы добавить дополнительную информацию. На самом деле проблема заключается в том, как я получаю значение поля blob, в котором есть нулевой символ (# 0). Я получаю каждый символ как двойной байт с добавлением нуля к каждому символу. Даже если я читаю его как массив байтов, я получаю этот нулевой символ, и zipforge не может извлечь, потому что он не ожидает этого нулевого символа. Приведенный выше фрагмент кода работает, когда мы передаем соответствующий тип строки (ansistring (в случае потока без нулевого символа), строка, если строка имеет нулевой символ) при чтении из потока.

Для информации, поле тип, который я получаю при чтении значения ftOraBlob, поскольку я использую базу данных oracle.

...