给为同仁,兄弟我最近写个串口通信的程序,从一个Edit Box得到一个字符串后需要将其转换成十六进制发送,使用的转换程序如下(网上看到的):
//将字符串转换成十六进制表示
CString ChangeCharstr2Hexstr(CString Charstr)
{
CString Hexstr=_T("");
Charstr.MakeUpper(); //字符串大写
HexStringFilter(Charstr);
int Length=Charstr.GetLength();
if(Length%2)
Charstr.Delete(Length-1);
Length=Charstr.GetLength();
for(int i=0;i<Length/2;i++)
{
Hexstr+=CombineHexChar(Charstr.GetAt(i*2),Charstr.GetAt(i*2+1));
}
return Hexstr;}//去掉非数字,空格等
void HexStringFilter(CString &str)
{
BOOL bOK;
for(int i=0;i<str.GetLength();)
{
bOK=((str.GetAt(i)>='0')&&(str.GetAt(i)<='9'))||
((str.GetAt(i)>='A')&&(str.GetAt(i)<='F'))||
((str.GetAt(i)>='a')&&(str.GetAt(i)<='f'));
if(!bOK)
str.Delete(i);
else i++;
}
}//进行数据处理
unsigned char CombineHexChar(unsigned char CharH,unsigned char CharL)
{
unsigned char result;
CString temp;
if(CharH>='0'&&CharH<='9') result=(CharH-'0');
else if(CharH>='a'&&CharH<='f') result=(CharH-'a'+10);
else if(CharH>='A'&&CharH<='F') result=(CharH-'A'+10);
else result=0;
result<<=4;
if(CharL>='0'&&CharL<='9') result+=(CharL-'0');
else if(CharL>='a'&&CharL<='f') result+=(CharL-'a'+10);
else if(CharL>='A'&&CharL<='F') result+=(CharL-'A'+10);
else result+=0;
return result;
}就是这样转换的,但是我不知道为什么无法转换0,00或是00开头的字符串。期待着您的解决!还有就是,最后返回的是CString型的,为什么我用SetDlgItemText()无法显示出来呢?
//将字符串转换成十六进制表示
CString ChangeCharstr2Hexstr(CString Charstr)
{
CString Hexstr=_T("");
Charstr.MakeUpper(); //字符串大写
HexStringFilter(Charstr);
int Length=Charstr.GetLength();
if(Length%2)
Charstr.Delete(Length-1);
Length=Charstr.GetLength();
for(int i=0;i<Length/2;i++)
{
Hexstr+=CombineHexChar(Charstr.GetAt(i*2),Charstr.GetAt(i*2+1));
}
return Hexstr;}//去掉非数字,空格等
void HexStringFilter(CString &str)
{
BOOL bOK;
for(int i=0;i<str.GetLength();)
{
bOK=((str.GetAt(i)>='0')&&(str.GetAt(i)<='9'))||
((str.GetAt(i)>='A')&&(str.GetAt(i)<='F'))||
((str.GetAt(i)>='a')&&(str.GetAt(i)<='f'));
if(!bOK)
str.Delete(i);
else i++;
}
}//进行数据处理
unsigned char CombineHexChar(unsigned char CharH,unsigned char CharL)
{
unsigned char result;
CString temp;
if(CharH>='0'&&CharH<='9') result=(CharH-'0');
else if(CharH>='a'&&CharH<='f') result=(CharH-'a'+10);
else if(CharH>='A'&&CharH<='F') result=(CharH-'A'+10);
else result=0;
result<<=4;
if(CharL>='0'&&CharL<='9') result+=(CharL-'0');
else if(CharL>='a'&&CharL<='f') result+=(CharL-'a'+10);
else if(CharL>='A'&&CharL<='F') result+=(CharL-'A'+10);
else result+=0;
return result;
}就是这样转换的,但是我不知道为什么无法转换0,00或是00开头的字符串。期待着您的解决!还有就是,最后返回的是CString型的,为什么我用SetDlgItemText()无法显示出来呢?
就是说这个字符串是数字如“123456789”?
如:DWORD dwStr = _tcstoul(str, NULL, 16); // 16代表16进制
你的转换函数有问题吧。
int HexValue(unsigned char a)
{
a -= 48;
if(a > 9 ) a -= 7;
return a;
}
//使用时要几位都可以,下面是2位。
CString str;
m_Combo.GetWindowText(str);//edit
//
m_SelectedType=HexValue(str.GetAt(0))*16+HexValue(str.GetAt(1));
的时候,char型的"0"的ASCII是0x48。这样处理后表示的数据的ASCII码为0x000,是个空字符。但是该如何修改呢?
如下;
CString cs = "12340056";
CString dd =ChangeCharstr2Hexstr(cs);
其中dd保存的就是0x12,0x34,0x00,0x56,其长度就是dd.GetLength() = 4,然后直接
发送dd,并发送4个字节。