Делает ли StringOf копию переданных ему данных?
Да, в соответствии с документами : 'Converts a byte array into a Unicode string using the default system locale.'
Есливы просто хотите получить доступ к TBytes в виде строки, почему бы не привести его к PChar (если это Unicode) или PAnsiChar, если это AnsiString?
Пример кода:
var
MyBuffer: TBytes;
BufferLength: integer;
BufferAsString: PChar;
BuferAsAnsiString: PAnsiChar;
begin
MyBuffer:= TFile.ReadAllBytes(Filename);
BufferLength:= SizeOf(MyBuffer);
BufferAsString:= PChar(@MyBuffer[0]);
BufferAsAnsiString:= PAnsiChar(@MyBuffer[0]);
//if there's no #0 at the end, make sure not to read past the end of the buffer!
РЕДАКТИРОВАТЬ
Я немного озадачен, почему вы не просто используете TFile.OpenRead
для получения FileStream.
Предположим, у вас есть гигабайт (ы) данных, и вы спешите.
Файловый поток позволит вам просто прочитать небольшой фрагмент данных, ускоряя процесс.
Этот пример кода читает весь файл, но его можно легко изменить, чтобы получить только небольшую часть:
var
MyData: TFileStream
MyString: string; {or AnsiString}
FileSize: integer;
Index: integer;
begin
MyData:= TFile.OpenRead(Filename);
try
FileSize:= MyData.GetSize;
SetLength(MyString,FileSize+1); //Preallocate the string;
Index:= 0;
MyData.Read(PChar(MyString[Index])^, FileSize);
finally
MyData.Free;
end;
//Do stuff with your newly read string.
Обратите внимание, что в последнем примере все еще сначала считываются все данные с диска (что можетили может быть не то, что вы хотите).Однако вы также можете читать данные кусками.
Все это проще с AnsiStrings, потому что там 1 символ = 1 байт: -).