소스분석좀 해주세요..
integer형(32bit)을 64bit hex값으로 변환하는것 같은데..
u,uh,ul의 사용에대해 모르겠습니다.
고수님들의 말씀 기다리겠습니다. ^.^*
Function Int642Hex(nFmt: Int64): String;
var
z: Integer;
u, uh, ul: Byte;
Begin
result := '';
for z := 7 downto 0 do Begin
u := (nFmt shr (z * 8)) and $FF;
uh := (u shr 4) and $F;
ul := u and $F;
if uh >= 10 Then result := Result + Chr(Byte('A')+uh-10)
else result := Result + Chr(Byte('0')+uh);
if ul >= 10 Then result := Result + Chr(Byte('A')+ul-10)
else result := Result + Chr(Byte('0')+ul);
End;
End;
먼저 진수 변환에 대해서 알아야 합니다. 자료구조 시간에 배운 기억을 더듬어
설명드리는데 저도 기억이 아리까리 함다.
int64는 64bit즉 8바이트 INteger형입니다.
nFmt := 10 요렇게 할당하면 2진수로는 어케 저장 될까요?
=> 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001010
요 2진수를 16진수로 변환하면 어케될까요? 2진수를 16진수로 변환할때에는 2진수를
4바이트씩 자른후 4바이트를 16진수형으로 변환합니다.
0001 -> 1
0010 -> 2
0011 -> 3
0100 -> 4
0101 -> 5
0110 -> 6
0111 -> 7
1000 -> 8
1001 -> 9
1010 -> A
1011 -> B
1100 -> C
1101 -> D
1110 -> E
1111 -> F
즉 4bit로 표현할수 있는 가지수는 16가지즉 16진수죠. 이해 가심니까?
나두 모르것는디 이해가 갈라나. 이해 안가면 자료구조 책 찾아보심이 빠름.
=> 00 00 00 00 00 00 00 00A
자 그럼 소스를 분석해 봅시다.
> Function Int642Hex(nFmt: Int64): String;
> var
> z: Integer;
> u, uh, ul: Byte;
> Begin
> result := '';
--for 문을 7부터 0까지 돌린건 int64가 8바이트니깐 1바이트씩 잘라서 변환할라구
한거 겠죠?
> for z := 7 downto 0 do Begin
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001010
-------- -------- -------- -------- -------- -------- -------- 00000000
=> (nFmt shr (7 * 8) 56bit를 오른쪽으로 밀어버리면 요렇게 되겠죠.
-------- -------- -------- -------- -------- -------- -------- 00000000
그리고 16진수$FF는 11111111 이니깐
-------- -------- -------- -------- -------- -------- -------- 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111
and 조건을 시키면 아래와 같은 결과 나오겠죠
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
u := (nFmt shr (z * 8)) and $FF;
그래서 u는 8바이트짜리 10진수값을 구했습니다.
다음은 u를 4바이트씩 잘라서 16진수 값을 구하는 겁니다. 방업은 같구요
> uh := (u shr 4) and $F;
> ul := u and $F;
> u := (nFmt shr (z * 8)) and $FF;
> uh := (u shr 4) and $F;
> ul := u and $F;
--요부분부터는 16진수 문자열로 변환하는 부분이구요
> if uh >= 10 Then result := Result + Chr(Byte('A')+uh-10)
> else result := Result + Chr(Byte('0')+uh);
> if ul >= 10 Then result := Result + Chr(Byte('A')+ul-10)
> else result := Result + Chr(Byte('0')+ul);
> End;
> End;
나두 몰르것당^^