C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[63296] sms 송수신 질문입니다. strtok_r 을 쓰는데..
번외편 [wifemylove] 1533 읽음    2010-12-20 13:35
안녕하세요 C++Builder 6 유저입니다.
sms 송수신을 하면서 문제가 생겨서 질문 드립니다.


수신을 하면 데이터 처리를 해주는 부분에서 문제가 생기는데요
수신 데이터는 <time>,<call back>,<ti>,<message encode>,<priority>,<data> 순서이며
실 데이터가 들어오면
20101220130546,00000000000,4098,16,0,54525452303030313031313134303031303130303030303030303030
이런식으로 들어옵니다.

,위치가 틀려질수 있기 때문에 strtok_r으로 , 를 찾고 ,와 , 사이의 데이터를 가지고 처리하려고 하는데
컴파일은 되지만 데이터 송신시에 문제가 발생하네요.
데이터는 2 Digit Hex라 처리하게 편하게 0x00과 같이 만들려고 합니다. 맨아래 for문 두개가 그 처리부분입니다.
예> 3030(ascii)(4byte) -> 00(2byte) -> 0x00(1byte)
비트연산을 해야될일이 많아서 for문으로 두번 묶었습니다.
두번째 for문은 데이터중 앞에16(5452545230303031)개는 빼고 묶어야 되서 8로 시작했습니다.

그리고 strtok_r은 string.h파일을 찾아보니 보이지 않아서 소스를 가져다 썼습니다.
혹시 잘못처리하고 있는 부분이 있는지 알려주시면 감사하겠습니다.
이틀째 보고 있는데 어디가 문제인지 모르겠네요.

---------------------------- 데이터 처리 ------------------------------------
void __fastcall TForm12::Comm1RxChar(TObject *Sender, DWORD Count)
{
        unsigned int i,j;
        static unsigned int serial_number;  
        char Buff[1024];
        static char data[1024];
        char serial_data[1024];
        Comm1->Read(serial_data,Count);

                for(i=0;i<Count;i++)
                {
                        data[serial_number] =   serial_data[i] ;

                        if( data[serial_number] == 0x0d )
                        {
                                if(strstr(data,"4098")!=NULL) // data가 메시지 텔레서비스일때
                                {
                                        char *tok = NULL, *pHolder = NULL;

                                        // Time parsing
                                        tok = strtok_r (data, ",", &pHolder);

                                        // Call Back Number parsing
                                        tok = strtok_r(NULL, ",", &pHolder);
                                        if(strcmp(tok,phone_num1)!=NULL)
                                        {
                                                RSV_NUM = RSV_ID1;
                                        }
                                        else if(strcmp(tok,phone_num2)!=NULL)
                                        {
                                                RSV_NUM = RSV_ID2;
                                        }
                                        // TID parsing
                                        if (pHolder[0] == ',')
                                        {
                                                pHolder++;
                                        }
                                        else
                                        {
                                                tok = strtok_r(NULL, ",", &pHolder);
                                        }

                                        // Message Encode parsing
                                        if (pHolder[0] == ',')
                                        {
                                                pHolder++;
                                        }
                                        else
                                        {
                                                tok = strtok_r(NULL, ",", &pHolder);
                                        }

                                        // Priority parsing
                                        if (pHolder[0] == ',')
                                        {
                                                pHolder++;
                                        }
                                        else
                                        {
                                                tok = strtok_r(NULL, ",", &pHolder);

                                        }

                                        // Data parsing
                                        tok = strtok_r(NULL, ",", &pHolder);
                                        int len,retlen;
                                        char chbyte[3];
                                        char retbuff[512];
                                        char process_buff[512];
                                        len = strlen(tok);

                                        for (i = 0; i < (len / 2); i++)
                                        {
                                                chbyte[0] = tok[i * 2];
                                                chbyte[1] = tok[(i * 2) + 1];
                                                chbyte[2] = '\0';

                                                retbuff[i] = strtol(chbyte, (char **) NULL, 16);
                                        }
                                        retlen = (len / 2);

                                        for (i = 8; i < (retlen / 2); i++)
                                        {
                                                chbyte[0] = retbuff[i * 2];
                                                chbyte[1] = retbuff[(i * 2) + 1];
                                                chbyte[2] = '\0';

                                                process_buff[i] = strtol(chbyte, (char **) NULL, 16);
                                        }
                                }     
                                serial_number = 0;
                        }

                        else
                        {
                                serial_number++ ;
                        }
                }
}

------------------ strtok_r ------------------------------------------------------
static char *strtok_r(char *s, const char *delim, char **last)
{
        register char *spanp;
        register int c, sc;
        char *tok;

        if (s == NULL && (s = *last) == NULL)
        return (NULL);

        cont:
        c = *s++;
        for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
                if (c == sc)
                goto cont;
        }

        if (c == 0) {        /* no non-delimiter characters */
                *last = NULL;
                return (NULL);
        }
        tok = s - 1;

        for (;;) {
                c = *s++;
                spanp = (char *)delim;
                do {
                        if ((sc = *spanp++) == c) {
                                if (c == 0)
                                        s = NULL;
                                else
                                        s[-1] = 0;
                                *last = (char *)s;
                                return (tok);
                        }
                } while (sc != 0);
        }
        /* NOTREACHED */
}

+ -

관련 글 리스트
63296 sms 송수신 질문입니다. strtok_r 을 쓰는데.. 번외편 1533 2010/12/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.