Delphi 以高性能的方式将字符串转换为十六进制

Delphi 以高性能的方式将字符串转换为十六进制,delphi,Delphi,我开发了以下函数来将字符串转换为十六进制值 function StrToHex(const S: String): String; const HexDigits: array[0..15] of Char = '0123456789ABCDEF'; var I: Integer; P1: PChar; P2: PChar; B: Byte; begin SetLength(Result, Length(S) * 2); P1 := @S[1]; P2 := @

我开发了以下函数来将字符串转换为十六进制值

function StrToHex(const S: String): String;
const
  HexDigits: array[0..15] of Char = '0123456789ABCDEF';
var
  I: Integer;
  P1: PChar;
  P2: PChar;
  B: Byte;
begin

  SetLength(Result, Length(S) * 2);
  P1 := @S[1];
  P2 := @Result[1];

  for I := 1 to Length(S) do
  begin
    B := Byte(P1^);
    P2^ := HexDigits[B shr 4];
    Inc(P2);
    P2^ := HexDigits[B and $F];
    Inc(P1);
    Inc(P2);
  end; 

end; 

现在我想知道是否有一种更有效的方法来转换字符串?

这似乎已经足够好了,您总是可以有一个字节->2个十六进制数字的查找表,但在大多数情况下,这(以及类似的优化)对我来说似乎是过火了

试试这个

   function String2Hex(const Buffer: Ansistring): string;
   var
     n: Integer;
   begin
     Result := '';
     for n := 1 to Length(Buffer) do
       Result := LowerCase(Result + IntToHex(Ord(Buffer[n]), 2));
   end;

根据您的Delphi版本:

D5-D2007

uses classes;
function String2Hex(const Buffer: Ansistring): string;
begin
  SetLength(result, 2*Length(Buffer));
  BinToHex(@Buffer[1], @result[1], Length(Buffer));
end;
D2009+

uses classes;
function String2Hex(const Buffer: Ansistring): string;
begin
  SetLength(result, 2*Length(Buffer));
  BinToHex(@Buffer[1], PWideChar(@result[1]), Length(Buffer));
end;
//stroint(“$”+MyString);
哎呀,我没有很好地阅读这个问题…

我知道这是一个非常古老的话题,但我觉得我有点需要分享我关于这个问题的代码。多年来,我一直使用我自己的十六进制编码,与弗兰的代码非常相似,但就在今天,我发现了一种更快的十六进制编码方法。使用我的旧HexEncode,编码一个180kb的二进制文件大约需要50秒,而使用此函数则需要6秒

function getHexEncode(txt : AnsiString) : AnsiString;
var
  a : integer ;
  st : TStringStream;
  buf : array [0..1] of AnsiChar;
  tmp : ShortString;
begin
  st := TStringStream.Create;
  st.Size := Length(txt)*2;
  st.Position := 0;
  for a:=1 to Length(txt) do
  begin
    tmp := IntToHex(Ord(txt[a]),2);
    buf[0] := tmp[1];
    buf[1] := tmp[2];
    st.Write(buf,2);
  end;
  st.Position := 0;
  Result := st.DataString;
  st.Free;
  //Result := '';  //my old code
  //for a:=1 to Length(txt) do Result := Result+IntToHex(Ord(txt[a]),2);  //my old code
end;

伟大的我刚刚做了一个性能测试,你的功能比我的更快(只是一点点)。谢谢您需要多久降低一次字符串的大小写,直到您确定它确实有效为止?@Forlan07,请再次进行测试。本示例中的代码为“Buffer”中的每个字符重新分配一次结果,使用IntToHex将数字转换为十六进制。。。不可能再快了!您的代码只分配一次内存,然后在文本上执行单个for循环,将其全部转换为十六进制。@Cosmin Prund:您是对的。。。似乎在我花时间的某个函数中有一个bug。我只是用了一个不同的函数来消磨时间。