CnPack Forum » 技术板块灌水区 » 将16进制字符串转化成内存二进制数据


2008-8-3 15:33 不得闲
将16进制字符串转化成内存二进制数据

在使用Ini文件的时候,发现不能向Ini文件中写入流数据。于是想了一种方法来写入流数据,其中用到了内存数据转16进制,和16进制转成
内存二进制数据,前面的内存数据转16进制的已经写过,可以看看我以前发的一个函数。今天把16进制转二进制的函数发上来,以供大家参考一下,希望能写出效率更高的转换函数来。


{*************************************************************}
{*    名称: HexToBin                                                                            *}
{*    功能: 将16进制字符串转换成二进制信息存入                                     *}
{*    作者: 不得闲                                                                               *}
{*    时间: 2008-08-02                                                                        *}
{*    用法:                                                                                         *}
{*        Mem := TMemoryStream.Create;                                                 *}
{*        Mem.SetSize(100);                                                                    *}
{*        str := '不得闲';                                                                          *}
{*       writeSize := HeToBin(strToHex(Str),Mem.Memory,4);                      *}
{*************************************************************}
function HexToBin(HexStr: string;BinnryBuf: pointer;BufSize: integer): integer;
asm
  push  ebx
  push  edi
  Push  ecx
  mov   edi,ecx
  test  eax,eax
  Jz    @@Exit
  test  edx,edx
  Jz    @@Exit
  test  ecx,ecx
  Jz    @@Exit
  mov   edi,[eax-4]
  shr   edi,1   //长度除2获得二进制实际长度
  cmp   edi,ecx   //比较实际长度和给定长度
  JB    @@Belive  //给定长度大于实际长度,直接执行,否则使用给定长度
  mov   edi,ecx   //使用给定长度
@@Belive:
  xor   ecx,ecx
  mov   bh,[eax] //字符
  cmp   bh,'0'   //查看是否在0到f之间的字符
  JB    @@Exit   //小于0
  cmp   bh,'f'
  JA    @@Exit   //大于f跳
  sub   bh,'0'
  mov   cl,bh
  mov   bh,byte ptr[ecx+@@Convert]
  shl   bh,4
  xor   ecx,ecx
  inc   eax     //指针前移
  mov   bl,[eax]
  cmp   bl,'0'   //查看是否在0到f之间的字符
  JB    @@Exit   //小于0
  cmp   bl,'f'
  JA    @@Exit   //大于f跳
  sub   bl,'0'
  mov   cl,bl
  mov   bl,byte ptr[ecx+@@Convert]
  xor   ecx,ecx
  mov   cl,bh
  and   ebx,00FFh
  add   ebx,ecx
  mov   [edx],ebx
  inc   eax
  inc   dx
  dec   edi
  JNZ  @@Belive
@@Exit:
  Pop   eax
  sub   eax,edi
  pop   edi
  pop   ebx
  ret
@@Convert:  //包含大小写的ABCDEF数组列
  DB  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1
  DB  -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
  DB  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  DB  -1,10,11,12,13,14,15
end;

[[i] 本帖最后由 不得闲 于 2008-8-3 15:35 编辑 [/i]]

2008-8-21 21:51 hbxfwjww
顶下,顺便灌灌水...

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.