20진수 변환

개발/Note 2021. 9. 16. 11:44
반응형

7세그먼트 LED는 아래와 같이 숫자 및 일부 영문자를 표시해 주는 디지털 표시 모듈이다.

7 세그먼트 LED

 

이 모듈에 숫자 이외에 출력 가능한 영문자는 다음과 같다.

A, b, C, d, E, F, H, L, P, U

이 모듈에 표현 가능한 최대 숫자는 10진수로 표현할 경우 0~9 10개의 

숫자(10진수)만 가능하지만 영문까지 사용할 경우 0~9, A~U

총 20개의 숫자/문자(20진수) 표현이 가능해 진다.

펌웨어 프로그래밍 작업을 하다보면 10진수와 20진수 변환해야

하는 경우가 생길 수 있는데 다음과 같이 변환하여 처리해 보았다.

 

// 20진수 문자열을 10진수 자료형 변수로 변환
/*
 좌측부터 10, .... 19
 A, b, C, d, E, F, H, L, P, U
 
 20진수 아스키코드 
 A:65(0x41)
 b:98(0x62)
 C:67(0x43)
 d:100(0x64)
 E:69(0x45)
 F:70(0x46)
 H:72(0x48)
 L:76(0x4C)
 P:80(0x50)
 U:85(0x55)
*/
unsigned long long convert20to10(char* str) {
    unsigned long long result = 0;
    unsigned long len = strlen(str);
    for (unsigned long i = 0; i < len; i++ ) {
        if ( str[i] >= 'A' && str[i] <= 'F' ) {         // A(65) ~ F(70)
            result = result * 20 + str[i] - 'A' + 10;
        } else if ( str[i] >= 'a' && str[i] <= 'f' ) {  // a(97) ~ f(102)
            result = result * 20 + str[i] - 'a' + 10;
        } else if ( str[i] >= '0' && str[i] <= '9' ) {  // 0(48) ~ 9(57)
            result = result * 20 + str[i] - '0';
        }
        else if (str[i] == 'H' || str[i] == 'h' ) { result = result * 20 + 16; }// H(72),h(104)
        else if (str[i] == 'L' || str[i] == 'l' ) { result = result * 20 + 17; }// L(76),l(108)
        else if (str[i] == 'P' || str[i] == 'p' ) { result = result * 20 + 18; }// P(80),p(112)
        else if (str[i] == 'U' || str[i] == 'u' ) { result = result * 20 + 19; }// U(85),u(117)
    }
    return result;
}


// 10진수 자료형 변수 값을 20진수 문자열로 변환
void convert10to20(unsigned long long decimal, char *result) {
    char szTemp[256] = {0,};
    unsigned long pos = 0;
    while(true) {
        unsigned long mod = decimal % 20;
        if (mod < 10) { // 0 ~ 9
            szTemp[pos] = 48 + mod;
        } else { //  A, b, C, d, E, F, H, L, P, U
            switch (mod) {
                case 10: szTemp[pos] = 'A'; break;
                case 11: szTemp[pos] = 'b'; break;
                case 12: szTemp[pos] = 'C'; break;
                case 13: szTemp[pos] = 'd'; break;
                case 14: szTemp[pos] = 'E'; break;
                case 15: szTemp[pos] = 'F'; break;
                case 16: szTemp[pos] = 'H'; break;
                case 17: szTemp[pos] = 'L'; break;
                case 18: szTemp[pos] = 'P'; break;
                case 19: szTemp[pos] = 'U'; break;
                default: break;
            }
        }
        decimal = decimal / 20;
        pos += 1;
        if (decimal == 0)
            break;
    }
    for (unsigned long i=0; i<pos; ++i) {
        result[i] = szTemp[pos-1-i];
    }
}

 

 

반응형

'개발 > Note' 카테고리의 다른 글

matplotlib 사용  (0) 2022.11.18
git 소스코드 비교  (0) 2022.02.23
RSA 암복호화 테스트  (0) 2021.02.05
RSA key 파일 생성  (0) 2021.02.05
용어 정리  (0) 2021.02.05
블로그 이미지

SKY STORY

,