델파이 코드로 작성하면 속도가 느릴것 같아서 어셈으로 한번 작성해 보았습니다.
관련 소스를 자료실에도 올려두겠습니다.
그럼, 총총 ^^;
{** 16진 헥사 스트링('4F' 'A3' 'FF3E' 등등)을 해당 스트링이 나타내는 16진 숫자로
변경하는 함수입니다. 단, 입력할 수 있는 데이터의 크기는 8바이트로 제한합니다.
그 이상을 넘는 경우에는 이 함수를 이용해서 코드를 확장해야 합니다.
@param strHexa 헥사 스트링('4F', '33', 'FF3A' 등)
@param nCount 헥사 스트링의 개수(8보다 크면 무조건 0을 반환함)
@result 헥사 스트링의 16진 숫자 변환값
@example
nRet:cardinal;
...
nRet:=FastHexaToInt('20', 2); // nRet에는 32(16진수로 $20) 이 들어감
nRet:=FastHexaToInt(strHexa[1], 2); // 문자열의 경우, 첫 번채 문자의 포인터를 넘겨주어야 함
*}
function FastHexaToInt(const strHexa; nCount:integer):longword;
asm
mov Result, 0
cmp EDX,0
Je @JustQuit // 개수가 0이면 바로 종료하도록 한다.
cmp EDX,8
Ja @JustQuit // 개수가 8보다 크면 바로 종료하도록 한다.
push ESI // 사용할 레지스터 저장
mov ESI, EAX
xor EBX, EBX
xor EAX, EAX
@Loop:
shl EBX, 4
mov AL, [ESI] // 한 바이트를 읽는다.
Inc ESI
cmp AL, $30
jl @End // AL < '0'
cmp AL, $39
ja @Alpha // AL < '9'
and AL, $0F // 소문자를 대문자로 만든다.
jmp @Count
@Alpha:
cmp AL, $61
jl @Next // AL < 'a'
cmp AL, $66
ja @End // AL < 'f'
and AL, $df // 소문자를 대문자로 만든다.
@Next:
cmp AL, $41
jl @End // AL < 'A'
cmp AL, $46
ja @End // AL < 'F'
sub Al, $37
관련 소스를 자료실에도 올려두겠습니다.
그럼, 총총 ^^;
{** 16진 헥사 스트링('4F' 'A3' 'FF3E' 등등)을 해당 스트링이 나타내는 16진 숫자로
변경하는 함수입니다. 단, 입력할 수 있는 데이터의 크기는 8바이트로 제한합니다.
그 이상을 넘는 경우에는 이 함수를 이용해서 코드를 확장해야 합니다.
@param strHexa 헥사 스트링('4F', '33', 'FF3A' 등)
@param nCount 헥사 스트링의 개수(8보다 크면 무조건 0을 반환함)
@result 헥사 스트링의 16진 숫자 변환값
@example
nRet:cardinal;
...
nRet:=FastHexaToInt('20', 2); // nRet에는 32(16진수로 $20) 이 들어감
nRet:=FastHexaToInt(strHexa[1], 2); // 문자열의 경우, 첫 번채 문자의 포인터를 넘겨주어야 함
*}
function FastHexaToInt(const strHexa; nCount:integer):longword;
asm
mov Result, 0
cmp EDX,0
Je @JustQuit // 개수가 0이면 바로 종료하도록 한다.
cmp EDX,8
Ja @JustQuit // 개수가 8보다 크면 바로 종료하도록 한다.
push ESI // 사용할 레지스터 저장
mov ESI, EAX
xor EBX, EBX
xor EAX, EAX
@Loop:
shl EBX, 4
mov AL, [ESI] // 한 바이트를 읽는다.
Inc ESI
cmp AL, $30
jl @End // AL < '0'
cmp AL, $39
ja @Alpha // AL < '9'
and AL, $0F // 소문자를 대문자로 만든다.
jmp @Count
@Alpha:
cmp AL, $61
jl @Next // AL < 'a'
cmp AL, $66
ja @End // AL < 'f'
and AL, $df // 소문자를 대문자로 만든다.
@Next:
cmp AL, $41
jl @End // AL < 'A'
cmp AL, $46
ja @End // AL < 'F'
sub Al, $37
@Count:
xor EBX, EAX
dec EDX // 비교할 데이터의 개수 감소
Jnz @Loop
mov Result, EBX
@End:
pop ESI // 사용할 레지스터 저장
@JustQuit:
end;