Правда не совсем приведение... Встала задача получить из TMemoryStream строку. Самый простой путь, он же и самый не эффективный, задать строке размер SetLength и потом просто скопировать память с помощью Move. Неэффективность налицо: двукратно увеличеное требование к памяти и время на копирование. Но есть вариант проще:
Type
TOpenedMemoryStream = Class(TMemoryStream);
Var
Data : PChar;
...
With TOpenedMemoryStream(AStream) Do
Begin
// Если выделенной памяти ровно столько сколько требуется потоку
// (обычно больше т.к. память выделяется блоками по 8192 байт)
// увеличиваем количество выделенной памяти не изменяя размера потока
If Capacity = Size Then
Capacity := Capacity + 1;
// Сразу за блоком, занимаемым потоком, записываем признак конца строки
// и сохраняем указатель на блок памяти для для последующей обработки
PByte(Integer(Memory) + Size)^ := 0;
Data := Memory;
End;
Теперь переменную Data можно приводить к строковому типу :)
Комментариев нет:
Отправить комментарий