Q&A

  • 소스분석좀...(15 lines)
소스분석좀 해주세요..

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;

1  COMMENTS
  • Profile
    김병식 2001.07.19 09:04
    소스를 보니깐 10진수를 16진수 문자열로 변환하는 함수네요.

    먼저 진수 변환에 대해서 알아야 합니다. 자료구조 시간에 배운 기억을 더듬어

    설명드리는데 저도 기억이 아리까리 함다.

    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;



    나두 몰르것당^^