gpt4 book ai didi

string - StringOf 是否复制传递给它的数据?

转载 作者:行者123 更新时间:2023-12-03 15:50:48 25 4
gpt4 key购买 nike

我正在读取一个文件,尝试通过检查前 n 个字节中的 NUL 字节来检查它是否是二进制文件,如果通过这种方式未确定它是二进制文件,则它作为字符串进行操作。我尝试循环一个字符串并检查第一个 n 索引是否为 NUL,但这会产生误报,而检查 TBytes 则不会。

我使用TFile.ReadAllBytes,它返回一个TBytes并对其执行NUL检查。然后,如果没有找到 NUL,我会在 TBytes 上使用 StringOf 来获取字符串。我想知道 StringOf 是否必须复制数据才能从中生成字符串(这些是大文件,所以我想避免这种情况),如果是这样,有什么更好的方法我正在尝试做什么。

最佳答案

Does StringOf make a copy of the data passed to it?

是的,according to the docs : '使用默认系统区域设置将字节数组转换为 Unicode 字符串。'

如果您只想将 TByte 作为字符串访问,为什么不将其转换为 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 个字节:-)。

关于string - StringOf 是否复制传递给它的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8614013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com