[MFC]用CString表示的HEX和ASCII之间转换

2020-03-10 15:03:30 浏览数 (1)

原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接:http://blog.csdn.net/humanking7/article/details/48111411


预期效果

在写串口程序的时候用到了要用 HEXASCII 之间的互相转换,这个是很简单,但是我用的是MFC中的 CString 来表示HEX的数字,而且中间要考虑一下HEX数字之间有空格间隔和无空格间隔等问题,类似的效果如下:

其实本质不是转换而是现实转换的效果( 有点绕,只是为了给人看 )

代码实现

ASCII转成HEX显示出来( 其实是CString之间的显示效果转换 )

代码语言:javascript复制
    CString CSerialPortTestDlg::Ascii2Hex(CString str_ASCII)
    {//转HEX
        int i;
        int length = str_ASCII.GetLength();
        CString str_HEX;
        CString temp;   

        for (i=0; i<length; i  )
        {       
            temp.Format("%2X ", str_ASCII.GetAt(i));
            str_HEX = str_HEX   temp;       
        }

        return str_HEX;
    }

HEX转成ASCII显示出来( 其实是CString之间的显示效果转换 )

代码语言:javascript复制
    CString CSerialPortTestDlg::Hex2Ascii(CString str_HEX)
    {//转ASCII
        int i,num,cnt;
        BOOL is_space = FALSE;
        int length = str_HEX.GetLength();//CString类型的HEX
        CString str_ASCII;//最终转换出的ASCII
        char* char_ASCII = (char*)malloc(length*sizeof(char));//实际上远远小于这个数据 
        memset(char_ASCII, 0, length*sizeof(char));
        str_ASCII.Empty();
        char char_temp;
        num = 0;
        cnt = 0;

        for (i=0; i<length; i  )
        {
            char_temp = str_HEX.GetAt(i);
            if (' '==char_temp || 'n'==char_temp || 't'==char_temp || 'r'==char_temp)
            {   
                if (FALSE == is_space)
                {
                    is_space = TRUE;
                    num  ;
                }
                continue;//如果是空格,直接进入下一个
            }

            if (char_temp>='0' && char_temp<='9')
            {               
                char_ASCII[num] = char_ASCII[num]*16   char_temp - '0';
                cnt  ;
                is_space = FALSE;//说明这一拍 不是空格
            }
            if (char_temp>='a' && char_temp<='z')
            {
                char_ASCII[num] = char_ASCII[num]*16   char_temp - 'a'   10;
                cnt  ;
                is_space = FALSE;//说明这一拍 不是空格
            }
            if (char_temp>='A' && char_temp<='Z')
            {
                char_ASCII[num] = char_ASCII[num]*16   char_temp - 'A'   10;
                cnt  ;
                is_space = FALSE;//说明这一拍 不是空格
            }
            if (cnt>=2)
            {
                cnt = 0;
                num  ;
                is_space = TRUE;
            }

        }
        for (i=0; i<=num; i  )
        {
            str_ASCII.AppendChar(char_ASCII[i]);
        }

        free(char_ASCII);
        return str_ASCII;
    }

0 人点赞