본문 바로가기

3.구현/C or C++

데이터 값을 비트 문자열로 변환

프로그래밍 하다보면 간혹 데이터 값을 이진수로 출력하고 싶을 때가 있다. 매번하기에 매우 귀찮은 작업이다. 그래서 간단하게 작성해서 만들어본다.

작성:[http://ospace.tistory.com/(ospace114@empal.com) 2009.12.23

코드

단순히 작성한 것이라서 자세한 에러처리는 본인이 직접하길 바란다. 잘못하면 버퍼 오버플로 발생할 수 있다. ^^;

enum {
    BIT_BUF_LEN = 512
};

char* bitToStr(char* val, int len)
{
    static char buf[BIT_BUF_LEN];

    int   l = 0;
    int   i = 0;

    memset (buf, 0, BIT_BUF_LEN);

#define PRN_BIT(v) (v) ? (buf[l++] = '1') : (buf[l++] = '0')
#define PRN_SPC()  buf[l++] = ' '

    for( i=0; i < len; ++i) {
        PRN_BIT( val[i] & 128 );
        PRN_BIT( val[i] & 64 );
        PRN_BIT( val[i] & 32 );
        PRN_BIT( val[i] & 16 );
        PRN_BIT( val[i] & 8 );
        PRN_BIT( val[i] & 4 );
        PRN_BIT( val[i] & 2 );
        PRN_BIT( val[i] & 1 );

        if( i != len-1 ) PRN_SPC();
    }

#undef PRN_BIT
#undef PRN_SPC

    buf[l] = '\0';

    return buf;
}

사용예

사용법은 간단하다.

int num = 11111;
printf("%s\n", bitToStr((char*)&num, sizeof(num))); 

<olclass="c" name="code" style="margin-left: 2em;">

출력결과:

01100111 00101011 00000000 00000000

결론

할려고하니 막막했는데, 실제 하다보니 쉽게 문제가 풀렸다. 오늘따라 머리가 좀 따라준다. ㅡ.ㅡ;

그리고 위의 출력을 보면 1바이트 단위로 중간에 공배를 두었다. 이는 읽기 편하게 하기 위한 것으로 빼도 상관은 없다.

한가지 주의할 것은 반환되는 문자열은 전역 문자열이기 때문에 이를 보관했다가 나중에 사용하려고 하면, 복제해두어야 한다.

그렇지 않으면 다음 bitToStr() 함수에 의해서 이전 변환된 결과가 사라져버린다.

위의 예제 처럼 바로 변환해서 바로 출력하면 결과가 사라져버리는 문제는 없다. 이미 출력되었기 때문에.. ^^;

반응형

'3.구현 > C or C++' 카테고리의 다른 글

가상함수 구조  (0) 2010.12.07
C에서 C++ 호출하기  (0) 2010.11.30
[링크에러 LNK2019] C++에서 C 함수 사용하기  (14) 2009.09.02
C로 객체지향 흉내내기2  (0) 2009.07.27
C로 객체지향 흉내내기1  (0) 2009.07.23