Delphi与汇编学习4(两个转16进制的函数)

Delphi与汇编学习 4 (两个转 16 进制的函数)由于在工作中需要,用汇编写了一个字符串转 16 进制的函数,有详细注释,应该对想学习的人有所帮助的。呵呵
DelphiCode:
 {功能:字符串转16进制
 作者:不得闲}
 function StrToHex(Const str: string): string;
 asm
     push ebx
     push esi
     push edi
     test eax,eax
     jz   @@Exit
     mov  esi,edx       //保存edx值,用来产生新字符串的地址
     mov  edi,eax       //保存原字符串
     mov  edx,[eax-4]  //获得字符串长度
     mov  ecx,edx       //保存长度
     Push ecx
     add  edx,edx
     mov  eax,esi
     call System.@LStrSetLength //设置新串长度
     mov  eax,esi       //新字符串地址
     Call UniqueString  //产生一个唯一的新字符串,串位置在eax中
     Pop   ecx
   @@SetHex:
     xor  edx,edx       //清空edx
     mov  dl, [edi]     //Str字符串字符
     mov  ebx,edx       //保存当前的字符
     shr  edx,4         //右移4字节,得到高8
     mov  dl,byte ptr[edx+@@HexChar] //转换成字符
     mov  [eax],dl      //将字符串输入到新建串中存放
     and  ebx,$0F       //获得低8位
     mov  dl,byte ptr[ebx+@@HexChar] //转换成字符
     inc  eax             //移动一个字节,存放低位
     mov  [eax],dl
     inc  edi
     inc  eax
     loop @@SetHex
   @@Exit:
     pop  edi
     pop  esi
     pop  ebx
     ret
   @@HexChar: db '0123456789ABCDEF'
 end;

 在群中,有人说要指针转16进制的函数,其实字符串本身就是按照指针的形式保存的,所以稍微修改一下就是指针区信息转16进制的函数了如下:

 {功能:指针区信息转16进制
 参数: Ptr指定指针,Len指定取得的数据长度
 作者:不得闲}
 function PointToHex(Const Ptr: pointer;Const Len: integer): string;
 asm
     Push ebx
     push esi
     push edi
     test eax,eax
     jz   @@Exit
     mov  edi,eax
     mov  esi,ecx
     mov  ecx,edx
     push ecx
     add  edx,edx
     mov  eax,esi
     call System.@LStrSetLength //设置新串长度
     mov  eax,esi       //新字符串地址
     Call UniqueString  //产生一个唯一的新字符串,串位置在eax中
     pop  ecx
   @@SetHex:
     xor  edx,edx       //清空edx
     mov  dl, [edi]     //Str字符串字符
     mov  ebx,edx       //保存当前的字符
     shr  edx,4         //右移4字节,得到高8
     mov  dl,byte ptr[edx+@@HexChar] //转换成字符
     mov  [eax],dl      //将字符串输入到新建串中存放
     and  ebx,$0F       //获得低8位
     mov  dl,byte ptr[ebx+@@HexChar] //转换成字符
     inc  eax             //移动一个字节,存放低位
     mov  [eax],dl
     inc  edi
     inc  eax
     loop @@SetHex

   @@Exit:
     pop  edi
     pop  esi
     pop  ebx
     ret
   @@HexChar: db '0123456789ABCDEF'
 end;

 使用比如:
 var
   Stream:TMemoryStream;
   s: String;
   i: integer;
 begin
   Stream := TMemoryStream.Create;
   s := '不得闲';
   i := 511;
   Stream.WriteBuffer(pointer(s)^,Length(s));
   ShowMessage(PointToHex(Stream.Memory,Stream.size));
   Stream.free;
这样就把整个Stream都转换成 16 进制了.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值