我开发了以下函数将字符串转换为十六进制值。
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;
现在我想知道是否有更有效的方法来转换字符串?
答案 0 :(得分:10)
取决于您的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;
答案 1 :(得分:3)
试试这个
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;
答案 2 :(得分:3)
我知道这是一个非常古老的话题,但我觉得我需要分享关于这个问题的代码。多年来我使用自己的HexEncode,与Forlan的代码非常相似,但就在今天,我发现了一种更快的Hex编码方式。使用我的旧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;
答案 3 :(得分:1)
看起来很好,你总是可以有一个byte-&gt; 2十六进制数字查找表,但是在大多数情况下(和类似的优化)对我来说似乎有些过分。
答案 4 :(得分:0)
// StrToInt('$'+ MyString); 哎呀,没读好这个问题......