DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: eschen
今日帖子: 14
在线用户: 40
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 aknightchen (.) ★☆☆☆☆ -
盒子活跃会员
2019/7/10 14:11:47
标题:
求助: Windows 与 Android 下的 BinToHex 如何处理.... 浏览:352
加入我的收藏
楼主: //XE5,Windows,

function StringToHex(sSrcStr:string):string;
var  //从XE5的帮助中,抄来的例子
  LStr1, LStr2: String;     //Knight.Chen
begin
  { Store the text in the memo to a String variable. }
  LStr1 := sSrcStr;
  { Set the length of the String to hold the conversion. }
  SetLength(LStr2, Length(LStr1) * 4);
  { Call the binary to hexadecimal conversion procedure. }
  BinToHex(LStr1[1], PWideChar(LStr2), Length(LStr1) * SizeOf(Char));
  { Put the results in Memo2. }
  Result := LStr2;
end;

Windows下运行结果: StringToHex('目')='EE76'  //Unicode编码

----------
XE10.Android

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;

Android下运行结果: StringToHex('目')='C4BF' //GB2312编码

--->怎么样书写代码,才能得到和Windows一样的结果呢?
----------------------------------------------
...
作者:
男 earthsbest (全能中间件) ▲▲△△△ -
注册会员
2019/7/10 15:24:10
1楼: function StringToHex(const Value: string): string;
var
  Length: Integer;
  InBytes, OutBytes: TBytes;
begin
  InBytes := TEncoding.Unicode.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;

用Unicode就和你的一样了。
----------------------------------------------
Delphi4Linux交流群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 aknightchen (.) ★☆☆☆☆ -
盒子活跃会员
2019/7/10 15:28:54
2楼: (其实我上面的代码,就是抄你的).

我按你上面的UTF8试了一下,
 
安卓下输入结果是: StringToHex('目') = 'E79BAE'
----------------------------------------------
...
作者:
男 aknightchen (.) ★☆☆☆☆ -
盒子活跃会员
2019/7/10 15:40:29
3楼: 你上面的代码,
我已改了: 

TEncoding.UTF8.             -->E79BAE
TEncoding.ANSI.             -->C4BF
TEncoding.UNICODE.          -->䕅㘷
TEncoding.ASCII.            -->3F
TEncoding.BigEndianUnicode. -->㜶䕅  
TEncoding.UTF7.             -->2B6475342D

都不行.

(自已实在菜, 不理解意思, 只能盲踩)





----------------------------------------------
...
作者:
男 aknightchen (.) ★☆☆☆☆ -
盒子活跃会员
2019/7/10 15:59:51
4楼: 第一个函数,我是直接从DELPHI XE5的帮助中抄来的. 
(XE10也是一样的帮助代码) ( Windows平台)

Delphi帮助中是以下: (我只改了函数头,其它什么也没动)

procedure Tfrm1.btToHexClick(Sender: TObject);
var
  LStr1, LStr2: String;

begin
  { Store the text in the memo to a String variable. }
  LStr1 := Memo1.Lines.Text;
  { Set the length of the String to hold the conversion. }
  SetLength(LStr2, Length(LStr1) * 4);
  { Call the binary to hexadecimal conversion procedure. }
  BinToHex(LStr1[1], PWideChar(LStr2), Length(LStr1) * SizeOf(Char));
  { Put the results in Memo2. }
  Memo2.Lines.Text := LStr2;
end;
----------------------------------------------
...
作者:
男 aknightchen (.) ★☆☆☆☆ -
盒子活跃会员
2019/7/10 16:49:30
5楼: TO 全能兄, 我搞定啦!!!

我采用枚举法,做了6个这样的类似函数.
组合出;ANSI UNICODE, UTF8

最后,以下两个是可以的.

  //UNICODE , UTF8
  function StringToHex5(const Value: string): string;
  var
    Length: Integer;
    InBytes, OutBytes: TBytes;
  begin
    InBytes := TEncoding.UNICODE.GetBytes(Value);
    Length  := System.Length(InBytes) shl 1;
    SetLength(OutBytes, Length);
    System.Classes.BinToHex(InBytes, 0, OutBytes, 0, Length shr 1);
    Result := TEncoding.UTF8.GetString(OutBytes);
  end;


  //UNICODE , ANSI
  function StringToHex6(const Value: string): string;
  var
    Length: Integer;
    InBytes, OutBytes: TBytes;
  begin
    InBytes := TEncoding.UNICODE.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;

这两个输出结果都是: EE76

感谢全能兄的参与. 也感谢你老早以前在论坛中提供的这个函数!!!
----------------------------------------------
...
作者:
男 aknightchen (.) ★☆☆☆☆ -
盒子活跃会员
2019/7/10 16:58:51
6楼: 哦. 我看到你二楼已指出: UNICODE,ANSI这个方法了.

可能当时我看错了. 非常感谢!
----------------------------------------------
...
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行15.625毫秒 RSS