给为同仁,兄弟我最近写个串口通信的程序,从一个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()无法显示出来呢?

解决方案 »

  1.   

    "从一个Edit Box得到一个字符串后需要将其转换成十六进制发送"
    就是说这个字符串是数字如“123456789”?
      

  2.   

    用C函数库直接转换 cstoul或_tcstoul
    如:DWORD dwStr = _tcstoul(str, NULL, 16); // 16代表16进制
      

  3.   

    恩,是这样的,但是如果从EditBox获得的是0或者是00开头就无法解析出来了!比如获得的是123456转换后是12 34 56但是如果是12003456最后就只能转换成12了!
      

  4.   

    字符串“12003456”中的’0‘是0x30可不是zero!
    你的转换函数有问题吧。
      

  5.   

    //只对一个字符取值。
    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));
      

  6.   

    我找到原因了,但是不知道改怎么修改。当执行if(CharH>='0'&&CharH<='9') result=(CharH-'0');
    的时候,char型的"0"的ASCII是0x48。这样处理后表示的数据的ASCII码为0x000,是个空字符。但是该如何修改呢?
      

  7.   

    我的做法是这样的,但是算出来后00字符串是0x00,ASCII是空字符串,所以就无法发送了的
      

  8.   

    char型的"0"的ASCII是0x48//0x30 十进制是48
      

  9.   

    这个肯定知道啊!写错了。现在情况是比如说CString str=“12340056”,我想得到的格式是0x12 0x34 0x00 0x56。但是按我的那个函数转换,得到的却是x12 0x 34后面就没有了?我想知道该怎么修改
      

  10.   

    发送时,要指定发送的长度,不要管里面是00或其他,因为0x00不能显示,但不影响发送,
    如下;
    CString cs = "12340056";
    CString dd =ChangeCharstr2Hexstr(cs);
    其中dd保存的就是0x12,0x34,0x00,0x56,其长度就是dd.GetLength() = 4,然后直接
    发送dd,并发送4个字节。