将16进制字符串转化成内存二进制数据

在使用Ini文件的时候,发现不能向Ini文件中写入流数据。于是想了一种方法来写入流数据,其中用到了内存数据转16进制,和16进制转成
内存二进制数据,前面的内存数据转16进制的已经写过,可以看看我以前发的一个函数。今天把16进制转二进制的函数发上来,以供大家参考一下,希望能写出效率更高的转换函数来。
  1. {*************************************************************}
  2. {*    名称: HexToBin                                        *}
  3. {*    功能: 将16进制字符串转换成二进制信息存入              *}
  4. {*    作者: 不得闲                                          *}
  5. {*    联系方式:suiyunonghen@gmail.com                       *}
  6. {*    时间: 2008-08-02                                      *}
  7. {*    用法:                                                 *}
  8. {*        Mem := TMemoryStream.Create;                       *}
  9. {*        Mem.SetSize(100);                                  *}
  10. {*        str := '不得闲';                                   *}
  11. {*       writeSize := HeToBin(strToHex(Str),Mem.Memory,4);   *}
  12. {*************************************************************}
  13. function HexToBin(HexStr: string;BinnryBuf: pointer;BufSize: integer): integer;
  14. asm
  15.   push  ebx
  16.   push  edi
  17.   Push  ecx
  18.   mov   edi,ecx
  19.   test  eax,eax
  20.   Jz    @@Exit
  21.   test  edx,edx
  22.   Jz    @@Exit
  23.   test  ecx,ecx
  24.   Jz    @@Exit
  25.   mov   edi,[eax-4]
  26.   shr   edi,1   //长度除2获得二进制实际长度
  27.   cmp   edi,ecx   //比较实际长度和给定长度
  28.   JB    @@Belive  //给定长度大于实际长度,直接执行,否则使用给定长度
  29.   mov   edi,ecx   //使用给定长度
  30. @@Belive:
  31.   xor   ecx,ecx
  32.   mov   bh,[eax] //字符
  33.   cmp   bh,'0'   //查看是否在0到f之间的字符
  34.   JB    @@Exit   //小于0
  35.   cmp   bh,'f'
  36.   JA    @@Exit   //大于f跳
  37.   sub   bh,'0'
  38.   mov   cl,bh
  39.   mov   bh,byte ptr[ecx+@@Convert]
  40.   shl   bh,4
  41.   xor   ecx,ecx
  42.   inc   eax     //指针前移
  43.   mov   bl,[eax]
  44.   cmp   bl,'0'   //查看是否在0到f之间的字符
  45.   JB    @@Exit   //小于0
  46.   cmp   bl,'f'
  47.   JA    @@Exit   //大于f跳
  48.   sub   bl,'0'
  49.   mov   cl,bl
  50.   mov   bl,byte ptr[ecx+@@Convert]
  51.   xor   ecx,ecx
  52.   mov   cl,bh
  53.   and   ebx,00FFh
  54.   add   ebx,ecx
  55.   mov   [edx],ebx
  56.   inc   eax
  57.   inc   dx
  58.   dec   edi
  59.   JNZ  @@Belive
  60. @@Exit:
  61.   Pop   eax
  62.   sub   eax,edi
  63.   pop   edi
  64.   pop   ebx
  65.   ret
  66. @@Convert:  //包含大小写的ABCDEF数组列
  67.   DB  0123456789,-1,-1,-1,-1,-1,-1
  68.   DB  -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
  69.   DB  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  70.   DB  -1,10,11,12,13,14,15
  71. end;

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值