昨天研究了一下Delphi2010的Unicode,同时也改了几个单元到2010中来,今天下午修改AES的加密库的时候,碰到一个问题,我将AES中的StrtoHex换成了自己写的汇编函数!其他的地方,都修改好了,但是加密之后总是没有结果返回!奇怪了半天,然后我将修改后的AES放到2007下去运行是一点问题都没有!最后调试了半天,将断点定在了StrToHex这个函数内部,调试运行也没发现问题,但是这个函数就是没结果返回。还真是奇怪了,于是翻开了它自己带的AnsiStrings单元查看里面相关的函数,晕,恍然大悟,原来在AnsiString的管理时也多加了一个CodePage的设置。既然如此,那么函数需要做相应的修改了哈!主题代码如下:
代码
function
StrToHex(Const str: Ansistring): Ansistring;
asm
push ebx
push esi
push edi
test eax,eax
jz @@Exit
mov esi,edx // 保存edx值,用来产生新字符串的地址
mov edi,eax // 保存原字符串
mov edx,[eax - 4 ] // 获得字符串长度
test edx,edx // 检查长度
je @@Exit { Length(S) = 0 }
mov ecx,edx // 保存长度
Push ecx
add edx,edx
mov eax,esi
{ $IFDEF VER210 }
movzx ecx, word ptr [edi - 12 ] { 需要设置CodePage }
{ $ENDIF }
call System.@LStrSetLength // 设置新串长度
mov eax,esi // 新字符串地址
Call UniqueString // 产生一个唯一的新字符串,串位置在eax中
Pop ecx
@@SetHex:
xor edx,edx // 清空edx
mov dl, [edi] // Str字符串字符
mov ebx,edx // 保存当前的字符
shr edx, 4 // 右移4字节,得到高8位
mov dl,byte ptr[edx + @@HexChar] // 转换成字符
mov [eax],dl // 将字符串输入到新建串中存放
and ebx,$0F // 获得低8位
mov dl,byte ptr[ebx + @@HexChar] // 转换成字符
inc eax // 移动一个字节,存放低位
mov [eax],dl
inc edi
inc eax
loop @@SetHex
@@Exit:
pop edi
pop esi
pop ebx
ret
@@HexChar: db ' 0123456789ABCDEF '
end ;
asm
push ebx
push esi
push edi
test eax,eax
jz @@Exit
mov esi,edx // 保存edx值,用来产生新字符串的地址
mov edi,eax // 保存原字符串
mov edx,[eax - 4 ] // 获得字符串长度
test edx,edx // 检查长度
je @@Exit { Length(S) = 0 }
mov ecx,edx // 保存长度
Push ecx
add edx,edx
mov eax,esi
{ $IFDEF VER210 }
movzx ecx, word ptr [edi - 12 ] { 需要设置CodePage }
{ $ENDIF }
call System.@LStrSetLength // 设置新串长度
mov eax,esi // 新字符串地址
Call UniqueString // 产生一个唯一的新字符串,串位置在eax中
Pop ecx
@@SetHex:
xor edx,edx // 清空edx
mov dl, [edi] // Str字符串字符
mov ebx,edx // 保存当前的字符
shr edx, 4 // 右移4字节,得到高8位
mov dl,byte ptr[edx + @@HexChar] // 转换成字符
mov [eax],dl // 将字符串输入到新建串中存放
and ebx,$0F // 获得低8位
mov dl,byte ptr[ebx + @@HexChar] // 转换成字符
inc eax // 移动一个字节,存放低位
mov [eax],dl
inc edi
inc eax
loop @@SetHex
@@Exit:
pop edi
pop esi
pop ebx
ret
@@HexChar: db ' 0123456789ABCDEF '
end ;
在LStrSetLength之前要同时传入CodePage设置,这样这个函数经过这样修改之后就可以正常返回信息了!
同时附上修改的AES代码 AES代码下载
本文转自 不得闲 博客园博客,原文链接: http://www.cnblogs.com/DxSoft/archive/2010/01/03/1638329.html ,如需转载请自行联系原作者