Q&A

  • 문자로된 핵사 값을 숫자로 바꾸는거요..
제가 초보라 그런가 잘모르겠어요

고수님들 알려주세요..

그럼 안녕히계세요
2  COMMENTS
  • Profile
    한원희 2002.07.13 20:17
    델파이 코드로 작성하면 속도가 느릴것 같아서 어셈으로 한번 작성해 보았습니다.
    관련 소스를 자료실에도 올려두겠습니다.

    그럼, 총총 ^^;


    {** 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;


  • Profile
    김도형 2002.07.13 18:35
    showmessage( inttostr( ord( 'F') ) );

    이렇게 하면 나오져~~~