16,748
社区成员
发帖
与我相关
我的任务
分享
procedure TForm1.Button1Click(Sender: TObject);
var
Len: Integer;
Str, Rst: String;
Buffer: TBytes;
begin
Str := StringReplace('\xbe\xad\xd1\xe9', '\x', '', [rfReplaceAll]);
Len := Str.Length div 2;
SetLength(Buffer, Len);
HexToBin(PChar(Str), Buffer, Len);
Rst := TEncoding.Ansi.GetString(Buffer);
ShowMessage(Rst);
end;
function Convert(const s: AnsiString): AnsiString;
type
ConvertState = (SCAN_SLASH, SCAN_X, PARSE);
var
i: Integer;
state: ConvertState;
b: array[0..1] of byte;
parseOrd: Byte;
resultOrd: Integer;
begin
SetLength(Result, Length(s) div 4);
resultOrd := 1;
state := SCAN_SLASH;
for i := 1 to Length(s) do
begin
case state of
SCAN_SLASH:
if s[i] = '\' then
begin
state := SCAN_X;
end;
SCAN_X:
if s[i] = 'x' then
begin
state := PARSE;
parseOrd := 0;
end
else if s[i] = '\' then
begin
//pass
end
else
state := SCAN_SLASH;
PARSE:
begin
if s[i] in ['0'..'9'] then
begin
b[parseOrd] := Ord(s[i]) - Ord('0');
end
else if s[i] in ['a'..'f'] then
begin
b[parseOrd] := Ord(s[i]) - Ord('a') + 10;
end
else if s[i] in ['A'..'F'] then
begin
b[parseOrd] := Ord(s[i]) - Ord('A') + 10;
end
else if s[i] = '\' then
begin
state := SCAN_X;
Break;
end
else
begin
state := SCAN_SLASH;
Break;
end;
if parseOrd >= 1 then
begin
Result[resultOrd] := AnsiChar((b[0] shl 4) or b[1]);
Inc(resultOrd);
state := SCAN_SLASH;
end
else
Inc(parseOrd);
end;
end;
end;
end;
ShowMessage(Convert('\xbe\xad\xd1\xe9'))
var
tmp,s: string;
buf: array of byte;
begin
tmp := '中文字符串和byte数组互转';
SetLength(buf,Length(tmp)*2);
SetLength(s,Length(tmp));
move(tmp[1],buf[0],Length(tmp)*2);
move(buf[0],s[1],Length(tmp)*2); //这里是你所需要的
ShowMessage(s);