음.. 팀작업이라서.. 딴 사람 작업 분량이 안끝나서.. 심심하던 차에 이걸 봤네용...
그냥 심심해서 함 만들어봤습니다..
key_map 변수를 전역으로 놓고 , 초기화 루틴도 메인으로 빼면 실행마다 처리 안하고 처리 되겠네요..
한자리씩 세팅하는게 거시기 한거 같아서요..
성호님 StrToInt 한방에 내부 처리 되는 거지만 ㅎㅎ 그냥 심심해서 만들어봤습니다.
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include
#include
#include
int HEXASTRTODECIMAL( char * str , int len );
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
char data[100];
memset( data , 0x00 , sizeof( data ));
scanf( "%s" , data );
printf( "INPUT Hexa Str : %s\n" , data );
printf( "Output Decimal : %ld\n" , HEXASTRTODECIMAL( data , strlen( data )));
getch();
return 0;
}
//---------------------------------------------------------------------------
int HEXASTRTODECIMAL( char * str , int len )
{
int key_map[255]; // 이거 전역
int rt = 0;
int calc = 0;
memset( key_map , -1 , sizeof( key_map )); // 이거
for( int i = '0' , j = 0 ; i <= '9' ; i++ , j++ ) key_map[i] = j; // 이거
for( int i = 'a' , j = 10 ; i <= 'f' ; i++ , j++ ) key_map[i] = j; // 이거
for( int i = 'A' , j = 10 ; i <= 'F' ; i++ , j++ ) key_map[i] = j; // 이거 전역으로 빼면 한번만 실행해서 초기화 완료.
// 클레스에 메소드로 넣는다면 초기화 에서 해주면 될듯
for( int i = len -1 , j = 0 ; i >= 0 ; i-- , j++)
{
calc = 1;
for( int x = 0 ; x < j ; x++ ) calc*=16;
rt += ( key_map[str[i]] * calc );
}
return rt;
}
테스트 결과
64
INPUT Hexa Str : 64
Output Decimal : 100
ffff
INPUT Hexa Str : ffff
Output Decimal : 65535
FFFF
INPUT Hexa Str : FFFF
Output Decimal : 65535
FF
INPUT Hexa Str : FF
Output Decimal : 255
나름은 제대로 나오는거 같네요..
즐플하십시요~~!
PS : </conio.h></stdlib.h></stdio.h></vcl.h> 코드 에디터에서 이거 나오는 거는 위에 인크루드된 넘들이 테그로
확인되서... "닫아야하는 군" 하고 친절하게 달아주는거 같군요.
땅주인 님이 쓰신 글 :
: 16진수 스트링을 decimal으로 변환하는 매크로를 작성했는데..
:
: 매크로 * 값 하면 에러 나고..
: 값 * 매크로 하면 에러가 나지 않네요.. 매크로를 수식 중간에 쓸 수 없다.. 뭐 이런 얘기는 못 들은 것 같은데..
:
:
: #define HEXTODECIMAL(x) (( x == "0") ? 0 : \
: (( x == "1") ? 1 : \
: (( x == "2") ? 2 : \
: (( x == "3") ? 3 : \
: (( x == "4") ? 4 : \
: (( x == "5") ? 5 : \
: (( x == "6") ? 6 : \
: (( x == "7") ? 7 : \
: (( x == "8") ? 8 : \
: (( x == "9") ? 9 : \
: (( x == "A") ? 10 : \
: (( x == "B") ? 11 : \
: (( x == "C") ? 12 : \
: (( x == "D") ? 13 : \
: (( x == "E") ? 14 : \
: (( x == "F") ? 15 : 0 ))))))))))))))));
: ....
: UnicodeString HexStr = "A5";
: int i,j,k;
: UnicodeString a,b;
: a = HexStr.SubString(1,1).UpperCase();
: b = HexStr.SubString(2,1).UpperCase();
:
: i = HEXTODECIMAL(a) * 16; // Error~! but => i = 16 * HEXTODECIMAL(a); => Ok~!
: j = HEXTODECIMAL(b);
:
: k = i + j;
:
:
: [BCC32 Error] Unit2.cpp(48): E2062 Invalid indirection
:
: 코스 상 좀 깔끔하지 않은 것 같아서.. 왜 이런 것이지요?
: 그리고, Hex String을 값으로 바꾸는 깔끔한 방법은?
:
: 감사합니다.