1:利用String 类型“可以实现”汉字与16进制的相互转化
Function TForm1.MyStrToHex(Str:String):String;
var
    i:Integer;
begin
    for i:=1 to Length(Str) do
        Result:=Result+IntToHex(Ord(Str[i]),2);
end;Function TForm1.MyHexToStr(Hex:String):String;
var
    i:Integer;
begin
    for i:=1 to Length(Hex) div 2 do
        Result:=Result+Chr(StrToInt('$'+Hex[2*i-1]+Hex[2*i]));
end;2:利用WideString 类型“无法实现”汉字与16进制的相互转化
Function TForm1.MyStrToHex(Str:WideString):WideString;
var
    i:Integer;
begin
    for i:=1 to Length(Str) do
        Result:=Result+IntToHex(Ord(Str[i]),2);
end;
Function TForm1.MyHexToStr(Hex:WideString):WideString;
var
    i:Integer;
begin
    for i:=1 to Length(Hex) div 2 do
        Result:=Result+Chr(StrToInt('$'+String(Hex)[2*i-1]+String(Hex)[2*i]));
end;问题:为什么???

解决方案 »

  1.   

    你看看 这个Ord(Str[i]), 是多少<WideStrign下。。
      

  2.   

    widestring是双字节类型,哪怕“a”它都用两个字节表示,“字”也用两个字节,
      

  3.   

    Result+IntToHex(Ord(BYTE(Str[i])),2); 使一个WideString<一个WORD> -> 一个BYTE...
      

  4.   

    对于WideString应该是
    Function TForm1.MyStrToHex(Str:WideString):String;
    var
        i:Integer;
    begin
        for i:=1 to Length(Str) do
            Result:=Result+IntToHex(Ord(Str[i]),4);
    end;
    Function TForm1.MyHexToStr(Hex:String):WideString;
    var
        i:Integer;
    begin
        for i:=1 to Length(Hex) div 4 do
            Result:=Result+Chr(StrToInt('$'+Hex[4*i-3]+Hex[4*i-2]+Hex[4*i-1]+Hex[4*i]));
    end;
      

  5.   

    to:  minjunw(minjunw) 
    我实验一下,发现只能转化进行单字节与16进制的转化,无法进行双字节与16进制的转化
      

  6.   

    //将汉字串转化为16进制 -> OK
    Function TForm1.MyStrToHex(Str:String):WideString;
    var
        i:Integer;
    begin
        for i:=1 to Length(Str) do
            Result:=Result+IntToHex(Ord(Str[i]),0);
    end;//将16进制转化为汉字串 -> 失败
    Function TForm1.MyHexToStr(Hex:String):WideString;
    var
        i:Integer;
    begin
        for i:=1 to Length(Hex) div 4 do
            Result:=Result+Chr(StrToInt('$'+Hex[4*i-3]+Hex[4*i-2]+Hex[4*i-1]+Hex[4*i]));
    end;
      

  7.   

    //将任意字符串转化为16进制 -> OK
    Function TForm1.MyStrToHex(Str:WideString):WideString;
    var
        PStr:PChar;
        i:Integer;
    begin
        GetMem(PStr,MAX_PATH);
        StrPCopy(PStr,String(Str));
        for i:=1 to Length(PStr) do
            Result:=Result+IntToHex(Ord(String(PStr)[i]),2);
        FreeMem(PStr);
    end;
    以上为正向转化->成功但是利用WideString类型将16进制 反向 转化为汉字还没有修改好,请各位帮忙
      

  8.   

    unction TForm1.UnicodeHexToStr(const asUnicodeHex: string): string;
    var
      i: Integer;
      sTemp: string;
    begin
      //“中国网管程序:操作说明”的Unicode编码16进制为:
      //4E2D 56FD 7F51 7BA1 7A0B 5E8F FF1A 64CD 4F5C 8BF4 660E
      for i := 1 to Length(asUnicodeHex) do
      begin
        if i mod 4 = 0 then
        begin
          sTemp := Copy(asUnicodeHex, i - 3, 4);
          sTemp := WideChar(StrToIntDef('$' + sTemp, 0));
          Result := Result + sTemp;
        end;
      end;
    end;
      

  9.   

    各位老兄:
    1:利用WideString 将 汉字 正向 转化为 16进制 已经解决,
    2:利用WideString 进行反向转化还是失败,以上方法均要求必须采用 WideString 才可以的呀?
      

  10.   

    请各位老兄注意:
    2:利用WideString 进行反向转化还是失败,
       要求必须采用 WideString 类型 做传入参数,传出结果也必须为 WideString 类型
      

  11.   

    还是要自己动手才性呀。。2:利用WideString 进行 16进制 反向转化 为汉字 --- OK
    Function TForm1.MyHexToStr(Hex:WideString):WideString;
    var
        PHex:PChar;
        i:Integer;
        tmp,tmp1,tmp2:WideString;
    begin
        GetMem(PHex,MAX_PATH);
          StrPCopy(PHex,String(Hex));
          for i:=1 to Length(PHex) div 2 do
              Result:=Result+Chr(StrToInt('$'+String(PHex)[2*i-1]+String(PHex)[2*i]));
          Result:='';
          i:=1;
          while i<=Length(PHex) do
             begin
                tmp:=Copy(String(PHex),i,1);
                if tmp>='A' then
                   begin //双字节
                       tmp:=Chr(StrToInt('$'+Copy(String(PHex),i,2)))+ Chr(StrToInt('$'+Copy(String(PHex),i+2,2)));
                       Result:=Result+tmp;
                       i:=i+4;
                   end
                else
                   begin
                       tmp:=Chr(StrToInt('$'+Copy(String(PHex),i,2)));
                       Result:=Result+tmp;
                       i:=i+2;
                   end;
             end;
        FreeMem(PHex);
    end;