gpt4 book ai didi

delphi - (宽)字符串 - 存储在 TFileStream,Delphi 7 中。最快的方法是什么?

转载 作者:行者123 更新时间:2023-12-03 14:56:49 25 4
gpt4 key购买 nike

我正在使用 Delphi7(非 unicode VCL),我需要在 TFileStream 中存储大量 WideString。我无法使用 TStringStream,因为(宽)字符串与二进制数据混合,该格式预计会加快加载和写入数据的速度...但是我相信当前加载/写入字符串的方式可能是我的代码的瓶颈...

目前我正在写入字符串的长度,然后逐个字符地写入......加载时,首先加载长度,然后逐个加载......

那么,将 WideString 保存和加载到 TFileStream 的最快方法是什么?

提前致谢

最佳答案

不要一次读写一个字符,而是一次读写所有字符:

procedure WriteWideString(const ws: WideString; stream: TStream);
var
nChars: LongInt;
begin
nChars := Length(ws);
stream.WriteBuffer(nChars, SizeOf(nChars);
if nChars > 0 then
stream.WriteBuffer(ws[1], nChars * SizeOf(ws[1]));
end;

function ReadWideString(stream: TStream): WideString;
var
nChars: LongInt;
begin
stream.ReadBuffer(nChars, SizeOf(nChars));
SetLength(Result, nChars);
if nChars > 0 then
stream.ReadBuffer(Result[1], nChars * SizeOf(Result[1]));
end;

现在,从技术上讲,由于 WideString 是 Windows BSTR,因此它可以包含奇数字节数。 Length 函数读取字节数并除以二,因此上面的代码有可能(尽管不太可能)截断最后一个字节。您可以改用此代码:

procedure WriteWideString(const ws: WideString; stream: TStream);
var
nBytes: LongInt;
begin
nBytes := SysStringByteLen(Pointer(ws));
stream.WriteBuffer(nBytes, SizeOf(nBytes));
if nBytes > 0 then
stream.WriteBuffer(Pointer(ws)^, nBytes);
end;

function ReadWideString(stream: TStream): WideString;
var
nBytes: LongInt;
buffer: PAnsiChar;
begin
stream.ReadBuffer(nBytes, SizeOf(nBytes));
if nBytes > 0 then begin
GetMem(buffer, nBytes);
try
stream.ReadBuffer(buffer^, nBytes);
Result := SysAllocStringByteLen(buffer, nBytes)
finally
FreeMem(buffer);
end;
end else
Result := '';
end;

灵感来自Mghie's answer ,已将我的 ReadWrite 调用替换为 ReadBufferWriteBuffer。如果后者无法读取或写入请求的字节数,则会引发异常。

关于delphi - (宽)字符串 - 存储在 TFileStream,Delphi 7 中。最快的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1354092/

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