Преобразование TMemoryStream для 'представления в виде строки' в Delphi 2009

numpy.array(R) * -1

является самым простым

, если вам нужно сделать это вручную

[[val*-1 for val in row] for row in R]

29
задан Zamrony P. Juhara 10 October 2018 в 10:31
поделиться

4 ответа

Ваш код неоправданно сложен, даже для более старых версий Delphi. Почему, в конце концов, выборка строковой версии потока заставляет перераспределять память потока?

function MemoryStreamToString(M: TMemoryStream): string;
begin
  SetString(Result, PChar(M.Memory), M.Size div SizeOf(Char));
end;

Это работает во всех версиях Delphi, а не только в Delphi 2009. Это работает, когда поток пуст без какого-либо особого случая. SetString - недооцененная функция.

Если содержимое вашего потока не меняется на Unicode с вашим переключением на Delphi 2009, тогда вы должны использовать эту функцию вместо этого:

function MemoryStreamToString(M: TMemoryStream): AnsiString;
begin
  SetString(Result, PAnsiChar(M.Memory), M.Size);
end;

Это эквивалентно Ваш оригинальный код, но пропускает особые случаи.

65
ответ дан Rob Kennedy 28 November 2019 в 00:40
поделиться

«Чистым» может быть:

function StreamToString(aStream: TStream): string;
var
  SS: TStringStream;
begin
  if aStream <> nil then
  begin
    SS := TStringStream.Create('');
    try
      SS.CopyFrom(aStream, 0);  // No need to position at 0 nor provide size
      Result := SS.DataString;
    finally
      SS.Free;
    end;
  end else
  begin
    Result := '';
  end;
end;
13
ответ дан 3 revs, 3 users 93% 28 November 2019 в 00:40
поделиться

Или, возможно, вы можете реорганизовать свой код для непосредственного использования TStringStream? Вы можете использовать его вместо TMemoryStream (они имеют одинаковый интерфейс), и вы можете «преобразовать» его в строку, просто вызвав myString: = myStringStream.DataString;

16
ответ дан John Thomas 28 November 2019 в 00:40
поделиться

Я еще не обновился, но я понимаю:

NewCapacity := (M.Size + 1) * SizeOf(Char);
2
ответ дан Peter Mortensen 28 November 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: