StringReplace的二进制版本 [英] Binary version of StringReplace

查看:126
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆