DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: sheik8888
今日帖子: 35
在线用户: 29
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 cn0754 (cn0754) ▲▲▲▲▲ -
注册会员
2017/12/25 1:17:27
标题:
XE下如何字符串转16进制 互转 浏览:612
加入我的收藏
楼主: function myStrToHex(s:string):string; //字串转16进制
var
  TmpStr:string;
  i:integer;
begin
  TmpStr:='';
  for i:=1 to Length(s)do
    TmpStr:=TmpStr+IntToHex(ord(s[i]),2);
  Result:=TmpStr;
end;

function myHexToStr(S:string):string; //16进制转字串
var
  HexS,TmpStr:string;
  i:Integer;
  a:Byte;
begin
  HexS:=s;
  if Length(HexS) mod 2=1 then
    HexS:=HexS+'0';
  TmpStr:='';
  for i:=1 to(Length(HexS) div 2)do
  begin
    a:=StrToInt('$'+HexS[2*i-1]+HexS[2*i]);
    TmpStr:=TmpStr+Chr(a);
  end;
  Result:=TmpStr;
end;

这个是D7代码。XE下乱码!转成XE能用的怎么改??
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2017/12/25 8:26:30
1楼: 跨平台 Unicode string 用 HexToStr StrToHex
http://2pascal.com/forum.php?mod=viewthread&tid=2731&fromuid=4
(出处: 2Pascal-新时代的Pascal)
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wuxiangyang (wxy) ★☆☆☆☆ -
盒子活跃会员
2017/12/25 8:59:48
2楼: function myStrToHex(s:AnsiString):AnsiString; //字串转16进制
var
  TmpStr:AnsiString;
begin
end;

function myHexToStr(S:AnsiString):AnsiString; //16进制转字串
var
  HexS,TmpStr:AnsiString;
begin
end;

          D7          XE
   String (AsniString)     =  AsniString
   WideString          =  String (WideString)
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲△△△ -
注册会员
2017/12/25 10:27:30
3楼: function StringToHex(const Value: string): string;
var
  Length: Integer;
  InBytes, OutBytes: TBytes;
begin
  InBytes := TEncoding.ANSI.GetBytes(Value);
  Length  := System.Length(InBytes) shl 1;
  SetLength(OutBytes, Length);
  System.Classes.BinToHex(InBytes, 0, OutBytes, 0, Length shr 1);
  Result := TEncoding.ANSI.GetString(OutBytes);
end;

function HexToString(const Hex: string): string;
var
  Length: Integer;
  InBytes, OutBytes: TBytes;
begin
  InBytes := TEncoding.ANSI.GetBytes(Hex);
  Length  := System.Length(InBytes) shr 1;
  SetLength(OutBytes, Length);
  System.Classes.HexToBin(InBytes, 0, OutBytes, 0, Length);
  Result := TEncoding.ANSI.GetString(OutBytes);
end;
----------------------------------------------
全能中间件QQ:64445322 http://www.cnblogs.com/rtcmw
作者:
男 nickemma (N.E) ▲▲▲▲△ -
注册会员
2018/9/11 22:17:08
4楼: @earthsbest (全能中间件)
感谢您提供的互转代码,但是测试发现有BUG,我的是10.1.2版本,FMX平台测试:

StringToHex(HexToString(FF000000FF))
返回正常

StringToHex(HexToString(FFEFEFEFFF))

返回是:FFEFEF3F
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ▲▲▲▲▲ -
普通会员
2018/9/12 8:44:18
5楼: function StringToHex(const ABuffer: AnsiString): AnsiString;
begin
  SetLength(Result, Length(ABuffer) * 2);
  BinToHex(PAnsiChar((ABuffer)), PAnsiChar((Result)), Length(ABuffer));
end;

function HexToString(const ABuffer: AnsiString): AnsiString;
begin
  SetLength(Result, Length(ABuffer) div 2);
  HexToBin(PAnsiChar(ABuffer), PAnsiChar(Result), Length(Result));
end;
----------------------------------------------
Delphi7爱好者
作者:
男 nickemma (N.E) ▲▲▲▲△ -
注册会员
2018/9/12 10:31:42
6楼: @dbyoung (dbyoung)您这个不能跨平台
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ▲▲▲▲▲ -
普通会员
2018/9/12 10:42:16
7楼: 这我到没注意。
BinToHex,HexToBin 是 Classes 单元的吧,自己看源码修改一下,跨平台应该不难。

我在FMX下测试了一下,也可以。Classes.pas 是公用单元呀。
不知道楼上的跨平台是啥意思?
----------------------------------------------
Delphi7爱好者
作者:
男 nickemma (N.E) ▲▲▲▲△ -
注册会员
2018/9/13 1:59:05
8楼: dbyoung (dbyoung)

我并不是说System.Classes.BinToHex/HexToBin函数不能跨平台
而是您采用了移动平台不支持的类型:
WideString,AnsiString, ShortString, AnsiChar, PAnsiChar, PWideChar, Openstring

而且您说在FMX上测试了一下,也可以。这样我就难以理解怎么编译成功的。
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2018/9/13 8:45:33
9楼: 估计他是在Windows下用的FMX.
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 偶的生活博客  偶的技术军事博客
作者:
男 pcplayer (pcplayer) ▲▲▲▲▲ -
普通会员
2018/9/13 10:53:59
10楼: 其实这个和 FMX 没关系。和 DELPHI 版本有关系。

D7 不是 UNICODE 的,string 里面,一个 char 就是一个字节。
新版本的 DELPHI,string 是 UNICODE 的,一个 char 是几个字节,不好说。

所以,楼主的代码,YouString[i] 获取一个字节,就不成立了。

在 UNICODE 下开发,类似的事,先转成 TBytes 再来干。

B: TBytes;
S: string;


B := BytesOf(S);

for i := 0 to Length(B) -1 do
begin
  do B[i];
end;
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行31.25毫秒 RSS