gpt4 book ai didi

delphi - 无法从字符串中删除 `Null Characters`

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

我问了类似的question几个月前。感谢Rob Kennedy我可以将整个文本加载到 Richedit 但我无法删除 Null chars 我可以加载我的文本,因为我使用了

<小时/>

现在在这段代码中:

var
strm : TMemorystream;
str : UTF8string;
ss : TStringstream;

begin
strm := tmemorystream.Create;

try
strm.LoadFromFile('C:\Text.txt');
setstring(str,PAnsichar(strm.Memory),strm.Size);
str := StringReplace(str, #0, '', [rfReplaceAll]); //This line doesn't work at all
ss := tstringstream.Create(str);
Richedit1.Lines.LoadFromStream(ss);
finally
strm.Free;
ss.Free;
end;
end;

我将TMemorystream转换为string,以使用StringReplace()删除Null Chars,然后再次将其转换为TStringstream 使用 Richedit.lines.LoadFromStream 加载它。

但我的问题是我无法使用StringReplace()删除Null Character。我可以替换其他字符,但不能替换 #0

有没有办法直接删除TMemorystream中的空字符并将其加载到Richedit中?如何?如果不可能或者非常复杂,当我将文本转换为字符串时如何删除它们?

谢谢。

最佳答案

Sertac的回答是准确的,你应该接受它。如果性能很重要,并且您有一个大字符串,并且频繁出现空字符,那么您应该尝试减少堆分配的数量。以下是我的实现方法:

function RemoveNull(const Input: string): string;
var
OutputLen, Index: Integer;
C: Char;
begin
SetLength(Result, Length(Input));
OutputLen := 0;
for Index := 1 to Length(Input) do
begin
C := Input[Index];
if C <> #0 then
begin
inc(OutputLen);
Result[OutputLen] := C;
end;
end;
SetLength(Result, OutputLen);
end;

如果你想直接在内存流中执行,那么你可以这样做:

procedure RemoveNullFromMemoryStream(Stream: TMemoryStream);
var
i: Integer;
pIn, pOut: PByte;
begin
pIn := Stream.Memory;
pOut := pIn;
for i := 0 to Stream.Size-1 do
begin
if pIn^ <> 0 then
begin
pOut^ := pIn^;
inc(pOut);
end;
inc(pIn);
end;
Stream.SetSize(NativeUInt(pOut)-NativeUInt(Stream.Memory));
end;

关于delphi - 无法从字符串中删除 `Null Characters`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18801835/

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