CnPack Forum


 
Subject: 将16进制字符串转化成内存二进制数据
不得闲
灌水科科长
Rank: 3Rank: 3



UID 40680
Digest Posts 3
Credits 118
Posts 33
点点分 118
Reading Access 10
Registered 2008-7-23
Status Offline
Post at 2008-8-3 15:33  Profile | Blog | P.M. 
将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;

[ 本帖最后由 不得闲 于 2008-8-3 15:35 编辑 ]
Top
hbxfwjww (流星无语)
普通灌水员
Rank: 2



UID 14409
Digest Posts 0
Credits 87
Posts 36
点点分 87
Reading Access 10
Registered 2007-5-18
Status Offline
Post at 2008-8-21 21:51  Profile | Blog | P.M.  | QQ
顶下,顺便灌灌水...




我就是我!
Top
 




All times are GMT++8, the time now is 2024-11-24 09:37

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.008617 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP