两段小代码 看不出有什么不同,就是结果不同,奇怪
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;
问题:为什么???
问题点数:0、回复次数:14Top
1 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-11-03 15:01:15 得分 0
你看看 这个Ord(Str[i]), 是多少<WideStrign下。。Top
2 楼wxj6688(wxj6688)回复于 2004-11-03 15:04:16 得分 0
那么应该怎么来解决呢??Top
3 楼micher_yan(人在江湖飘)回复于 2004-11-03 15:04:36 得分 0
widestring是双字节类型,哪怕“a”它都用两个字节表示,“字”也用两个字节,Top
4 楼wxj6688(wxj6688)回复于 2004-11-03 15:22:19 得分 0
各位好汉快帮我一下,怎么才能处理好呢???Top
5 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-11-03 15:26:09 得分 0
Result+IntToHex(Ord(BYTE(Str[i])),2); 使一个WideString<一个WORD> -> 一个BYTE...
Top
6 楼minjunw(minjunw)回复于 2004-11-03 15:31:10 得分 0
对于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;Top
7 楼wxj6688(wxj6688)回复于 2004-11-03 15:41:56 得分 0
to: minjunw(minjunw)
我实验一下,发现只能转化进行单字节与16进制的转化,无法进行双字节与16进制的转化Top
8 楼wxj6688(wxj6688)回复于 2004-11-03 15:52:16 得分 0
//将汉字串转化为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;
Top
9 楼wxj6688(wxj6688)回复于 2004-11-03 17:12:53 得分 0
//将任意字符串转化为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进制 反向 转化为汉字还没有修改好,请各位帮忙Top
10 楼miky(miky)回复于 2004-11-03 18:19:10 得分 0
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;
Top
11 楼phy(被爱捶死)回复于 2004-11-03 18:26:29 得分 0
呵呵,这么多人已经帮忙了,我帮忙顶。。。少给点。。。哈哈,多了我受不起。。Top
12 楼wxj6688(wxj6688)回复于 2004-11-04 11:10:40 得分 0
各位老兄:
1:利用WideString 将 汉字 正向 转化为 16进制 已经解决,
2:利用WideString 进行反向转化还是失败,以上方法均要求必须采用 WideString 才可以的呀?
Top
13 楼wxj6688(wxj6688)回复于 2004-11-04 11:17:13 得分 0
请各位老兄注意:
2:利用WideString 进行反向转化还是失败,
要求必须采用 WideString 类型 做传入参数,传出结果也必须为 WideString 类型
Top
14 楼wxj6688(wxj6688)回复于 2004-11-04 12:51:23 得分 0
还是要自己动手才性呀。。。。。
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;
Top




