代码之家  ›  专栏  ›  技术社区  ›  oopbase Jayachandran Murugesh

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

  •  5
  • oopbase Jayachandran Murugesh  · 技术社区  · 15 年前

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

    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; 
    

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

    5 回复  |  直到 11 年前
        1
  •  10
  •   Uwe Raabe    15 年前

    取决于您的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;
    
        2
  •  3
  •   Bharat    15 年前

    试试这个

       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;
    
        3
  •  2
  •   Khaidir Mustafa    11 年前

    我知道这是一个非常古老的话题,但我觉得我有点需要分享关于这个问题的代码。多年来,我使用自己的十六进制编码,与上面的Forlan代码非常相似,但就在今天,我发现了一种更快的十六进制编码方法。使用旧的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;
    
        4
  •  1
  •   Ofir    15 年前

    看起来已经足够好了,您可以一直拥有一个byte->2个十六进制数字的查找表,但在大多数情况下(以及类似的优化)对我来说似乎是多余的。

        5
  •  0
  •   Erik    15 年前

    //strToInt(“$”+myString); 哎呀,没把问题读得很好…