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

来源:互联网 发布:网络推广策划案 编辑:程序博客网 时间:2024/06/16 11:19
在使用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;

原创粉丝点击