在使用Ini文件的时候,发现不能向Ini文件中写入流数据。于是想了一种方法来写入流数据,其中用到了内存数据转16进制,和16进制转成
内存二进制数据,前面的内存数据转16进制的已经写过,可以看看我以前发的一个函数。今天把16进制转二进制的函数发上来,以供大家参考一下,希望能写出效率更高的转换函数来。
内存二进制数据,前面的内存数据转16进制的已经写过,可以看看我以前发的一个函数。今天把16进制转二进制的函数发上来,以供大家参考一下,希望能写出效率更高的转换函数来。
- {*************************************************************}
- {* 名称: HexToBin *}
- {* 功能: 将16进制字符串转换成二进制信息存入 *}
- {* 作者: 不得闲 *}
- {* 联系方式:suiyunonghen@gmail.com *}
- {* 时间: 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;