在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
昨天研究了一下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; 在LStrSetLength之前要同时传入CodePage设置,这样这个函数经过这样修改之后就可以正常返回信息了! 同时附上修改的AES代码 AES代码下载 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论