본문 바로가기
C & C++/MFC Network

시리얼 통신 필수 함수(HexToInteger, HexToFloat, HexToDouble)

by izen8 2013. 11. 14.
반응형

원본 출처 : 여기 여기

 

시리얼통신할때 필요한 함수들이다

 

//BUFFER_SIZE는 배열이 가지는 최대값이다(예 #define BUFFER_SIZE 4096)

 //hex값을 integer형으로 변경, 0xabcd ->43981, 2465 -> 2465

BOOL GetHexStringToInteger(__in CStringA strHex, __inout int& nValue)

{

    strHex.Replace(" ", "");

    strHex.Trim("\r\n ");

 

    nValue = strtol(strHex, NULL, 16);

 

 

    return TRUE;

}

 

//hex값을 float값으로

BOOL GetHexStringToFloat(__in CStringA strHex, __inout double& fValue)

{

    strHex.Trim("\r\n ");

    strHex.Replace(" ", "");

    strHex.Replace("0x", "");

 

    if(strHex.GetLength() != 8)

        return FALSE;

 

    int nCnt = 0;

    for(int i = 0; i < strHex.GetLength(); i++)

    {

        if(!isdigit(strHex.GetAt(i)) && !isalpha(strHex.GetAt(i)))

            return FALSE;

    }

 

    int      iLen = strHex.GetLength(), iCnt, iDataCtr;

    unsigned char   bData;

 

    union FloatHex

    {

        unsigned char   uData[4];   

        float         fValue;      

    }uConvert;

 

    iDataCtr = (iLen / 2) - 1;         

 

    for (iCnt=0; iCnt<iLen; ++iCnt)

    {

        bData = strHex.GetAt(iCnt);      

        if (bData > '9')            

            bData -= 7;

        bData <<= 4;              

        uConvert.uData[iDataCtr] = bData;

 

 

        ++iCnt;                    

        bData = strHex.GetAt(iCnt);   

        if (bData > '9')            

            bData -= 7;

        bData -= '0';               

        uConvert.uData[iDataCtr] |= bData;

 

        --iDataCtr;                 

    }

 

    fValue = uConvert.fValue;

    return TRUE;

}

 

//hex값을 double값으로

BOOL GetHexStringToDouble(__in CStringA strHex, __inout double& fValue)

{

    strHex.Trim("\r\n ");

    strHex.Replace(" ", "");

    strHex.Replace("0x", "");

 

    if(strHex.GetLength() != 16)

        return FALSE;

 

    int nCnt = 0;

    for(int i = 0; i < strHex.GetLength(); i++)

    {

        if(!isdigit(strHex.GetAt(i)) && !isalpha(strHex.GetAt(i)))

            return FALSE;

 

    }

 

    int      iLen = strHex.GetLength(), iCnt, iDataCtr;

    unsigned char   bData;

 

    union DoubleHex

    {

        unsigned char   uData[8];

        double         fValue;

    }uConvert;

 

    iDataCtr = (iLen / 2) - 1;

 

    for (iCnt=0; iCnt<iLen; ++iCnt)

    {

        bData = strHex.GetAt(iCnt);

        if (bData > '9')

            bData -= 7;

        bData <<= 4;

        uConvert.uData[iDataCtr] = bData;

 

        ++iCnt;

        bData = strHex.GetAt(iCnt);

        if (bData > '9')

            bData -= 7;

        bData -= '0';

        uConvert.uData[iDataCtr] |= bData;

 

        --iDataCtr;

    }

 

    fValue = uConvert.fValue;

    return TRUE;

}

 

//30 41 30 31 30 30 52 45 50 4F 52 54 39 44 0D => 0A0100REPORT9D 로 변경

void StringToBytesArray(__in const char* pszSrcBuf, __inout BYTE* Result, __inout int& nLen)

{

    char* pszStop = NULL;

    char *token = NULL;

    int nToken[BUFFER_SIZE] = {-1,};

    char szBytesString[BUFFER_SIZE] = {0,};

 

    if(!pszSrcBuf)

        return;

 

    if(strlen(pszSrcBuf) < BUFFER_SIZE)

        strcpy_s(szBytesString, BUFFER_SIZE, pszSrcBuf);

    else

    {

        memset(Result, 0, BUFFER_SIZE);

        nLen = 0;

        return;

    }

 

    token = strtok(szBytesString, " ");

    char szBuf[2] = {0,};

    int i = 0;

    while(token!=NULL)

    {

        nToken[i] = strtol(token, &pszStop, 16);//HexToInt(token);

        sprintf(szBuf, "%c", nToken[i]);

        token = strtok(NULL," ");

        memcpy(&Result[i], &szBuf[0], 1);

        i++;

    }

 

    nLen = i;

}

 

//0A0100REPORT9D => 30 41 30 31 30 30 52 45 50 4F 52 54 39 44 0D 로 변경

void BytesToString(__in const BYTE* ByteSrc, __inout char* szBytes, __inout int& nLen)

{

    char szTemp[3] = {0,};

    char szSpace = ' ';

    int nSpace = 0;

    CStringA strBuf;

    for(int i = 0; i < nLen; i++)

    {

        sprintf(szTemp, "%02x", ByteSrc[i]);

        strBuf += szTemp;

        strBuf += " ";

    }

    strBuf = strBuf.Trim(" ");

    nLen = strBuf.GetLength();

    if(nLen < BUFFER_SIZE)

        strcpy_s(szBytes, BUFFER_SIZE, strBuf);

    else

    {

        memset(szBytes, 0, BUFFER_SIZE);

        nLen = 0;

    }

 

}

반응형

댓글