天天看點

Delphi的字元串與16進制的互相轉換函數的彙編代碼

年終獎沒發,心情有點低落,不想做公司的東西,于是将以前一個朋友問的關于字元串與16進制串的互相轉換的彙編代碼實作了一下,沒啥技術含量,按照Delphi的彙編規則走就行了,裡面也沒有涉及到任何算法!速度快或 不快都不重要,僅僅是無事發洩一下的玩意(隻測試2007,2010的我沒測試,如果有2010的自行測試一下),代碼如下:

<a></a>

代碼

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

shl edx,1

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;

function HexToStr(const Str: AnsiString): AnsiString;

test eax,eax //為空串

mov edi,eax

mov esi,edx

mov edx,[eax-4]

test edx,edx

je @@Exit

mov ecx,edx

push ecx

shr edx,1

mov eax,esi //開始構造字元串

xor ebx,ebx

xor esi,esi

@@CharFromHex:

xor edx,edx

cmp dl, '0' //檢視是否在0到f之間的字元

JB @@Exit //小于0,退出

cmp dl,'9' //小于=9

ja @@DoChar//CompOkNum

sub dl,'0'

jmp @@DoConvert

@@DoChar:

//先轉成大寫字元

and dl,$DF

cmp dl,'F'

ja @@Exit //大于F退出

add dl,10

sub dl,'A'

@@DoConvert: //轉化

inc ebx

cmp ebx,2

je @@Num1

shl edx,4

jmp @@Num2

@@Num1:

add esi,edx

mov edx,esi

@@Num2:

dec ecx

test ecx,ecx

jnz @@CharFromHex

procedure TForm1.Button1Click(Sender: TObject);

var

str: Ansistring;

begin

str := '不得閑按時打發';

str := StrToHex(str);

ShowMessage(str);

ShowMessage(HexToStr(str));

繼續閱讀