原创文章,欢迎转载。转载请注明:转载自 祥的博客
原文链接:http://blog.csdn.net/humanking7/article/details/48111411
预期效果
在写串口程序的时候用到了要用 HEX 和 ASCII 之间的互相转换,这个是很简单,但是我用的是MFC中的 CString
来表示HEX的数字,而且中间要考虑一下HEX数字之间有空格间隔和无空格间隔等问题,类似的效果如下:
其实本质不是转换而是现实转换的效果( 有点绕,只是为了给人看 )
代码实现
ASCII转成HEX显示出来( 其实是CString之间的显示效果转换 )
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之间的显示效果转换 )
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;
}