将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 编辑 ]
|