StringReplace的二进制版本 [英] Binary version of StringReplace
问题描述
我正在尝试在一个RawByteString上运行AnsiStrings.StringReplace,它持有一个数据块,其中一些数据需要被替换。它会工作,除了里面的StringReplace它将我的字符串转换为一个PAnsiChar,所以搜索结束一旦遇到blob中的第一个#0字节,bail结束。
I'm trying to run AnsiStrings.StringReplace on a RawByteString holding a blob of data, some of which needs to be replaced. It would work, except that inside StringReplace it converts my string to a PAnsiChar, and so the search ends up bailing out as soon as it hits the first #0 byte inside the blob.
我正在寻找一个像StringReplace一样的例程,但是可以安全地使用可能包含空字节的blob。有人知道一个吗?
I'm looking for a routine that works just like StringReplace, but is safe to use on blobs that may contain null bytes. Does anyone know of one?
推荐答案
我猜猜StringReplace中的Offending函数是AnsiPos-> AnsiStrPos
I'd guess the "Offending" function in StringReplace is AnsiPos->AnsiStrPos
所以...我猜想一个已经在工作的解决方案,我会复制/粘贴StringReplace代码,并更改其他的AnsiPos。 (即AnsiStrings.PosEx)
So... I guess short of an already working solution, I'd copy/paste the StringReplace code and change AnsiPos for something else. (i.e. AnsiStrings.PosEx)
function RawByteStringReplace(const S, OldPattern, NewPattern: AnsiString;
Flags: TReplaceFlags): AnsiString;
var
SearchStr, Patt, NewStr: AnsiString;
Offset: Integer;
begin
//Removed the uppercase part...
SearchStr := S;
Patt := OldPattern;
NewStr := S;
Result := '';
while SearchStr <> '' do
begin
Offset := AnsiStrings.PosEx(Patt, SearchStr);
if Offset = 0 then
begin
Result := Result + NewStr;
Break;
end;
Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;
NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);
if not (rfReplaceAll in Flags) then
begin
Result := Result + NewStr;
Break;
end;
SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
end;
end;
这篇关于StringReplace的二进制版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!