我在程序中用unsigned char型实现一些操作,然后将unsigned char型结果通过编辑框显示出来,也就是将unsigned char转化为CString,想用的时候再将CString转化为unsigned char;
但现在我遇到转化会发生问题,因为结果总是不对。
我的转化过程:  unsigned char  char_tep[10]="refrefre";
                CString str_tep;
                str_tep.Format("%s",(char*)char_tep);  往回转化是   string str=str_tep.GetBuffer(0);
               unsigned char *kkk=(unsigned char *)str.c_str();我认为问题发生在越界上面 unsigned char  范围0~255 char -128~ 127
                         当unsigned char  大于128时,会是怎样呀,
   还有CString的内部实现又是什么样的,总之能解决问题就行,急呀!!!!

解决方案 »

  1.   

    你要知道unsigned char 是单字节,CString是个字符串 ,双字节使用如下函数做单双,双单字节转换。
    void wchar2char( char * dest, wchar_t * src, int lim)
    {
        int nResult;    nResult = WideCharToMultiByte(
            CP_ACP,    
            0,
            src,
            wcslen(src)+1,
            dest,
            0,
            NULL,
            FALSE);
        if(nResult > 0)
        {
            nResult = WideCharToMultiByte(
                CP_ACP,    
                0,
                src,
                wcslen(src)+1,
                dest,
                nResult,
                NULL,
                FALSE);
        }
    }void char2wchar( wchar_t * dest, char * src, int lim)
    {
        int nResult;
        
        nResult = MultiByteToWideChar(
            CP_ACP,    
            MB_PRECOMPOSED,
            src,
            strlen(src)+1,
            dest,
            0);
        if (nResult > 0)
        {
            nResult = MultiByteToWideChar(
                CP_ACP,    
                MB_PRECOMPOSED,
                src,
                strlen(src)+1,
                dest,
                nResult);
        }
    }
      

  2.   

    我写了个使用MFC的控制台程序,采用楼主的代码,输出没发现问题呀? unsigned char  char_tep[10]="refrefre"; 
    CString str_tep; 
    str_tep.Format("%s",(char*)char_tep);
    string str=str_tep.GetBuffer(0); 
    unsigned char *kkk=(unsigned char *)str.c_str();
    cout<<kkk;
      

  3.   

    要看你有没有定义UNICODE了,定义了就是宽字符了
    建议你用TCHAR
      

  4.   

    string str=str_tep.GetBuffer(0); 
    这个位置怎么转化也转化不了,改为:
    string str=str_tep.GetBuffer(str_tep.GetLength());
      

  5.   

    那块发生了问题?
    你将unsigned char *kkk 转换为(char*)kkk 试试另外建议用CString 的getlength()函数得到字符串的长度
    CString 到 unsigned char 
    通过memcpy来进行转换 转换后长度为getlength的长度
      

  6.   

    CString->unsigned char
    若数组为定长
    可以 
    unsigned char arr[20];
    CString str;
    strcpy(arr, str);//把CString类型的字符放到一个字符型数组中
    若为不定长,可以用new动态分配
    char *arr = new char[str.GetLength()+1];  unsigned char->CString
    unsigned char   arr[20]";   
      CString   str;     
      str.Format("%s",str);
      

  7.   

    另外补充:若用了UNICODE,则定义宽字符,用TCHAR
    CString->TCHAR*的转化可以用函数GetBuff()函数原型为:LPTSTR GetBuffer( int nMinBufLength );
    CString str("CString");
    TCHAR* szMsg = new TCHAR[100];
    //其参数为CString字符串的长度
    szMsg = str.GetBuffer(str.GetLength());
    str.ReleaseBuffer();
    delete []szMsg;
    szMsg = NULL;TCHAR*->CString的转化TCHAR szTchar[18] = L"TCHAR";
    CString str;
    str.Format(_T("%s"),szTchar);
      

  8.   

    我做了一个东西,要调用一个函数,哪儿函数的接口参数是unsigned char型的,你们说的Tchar类型也要转换的吧!我编的那个程序,现在时偶尔会出现错误数据!我先试一下二楼说的吧,但你说的int lim参数实干什么的,好像在函数中,并没有体现呀!其他人好像都不行的!
      

  9.   

    我真是晕了!
    CString无论是CStringA还是CStringW,其构造函数或者等号都能完美就收unsigned char类型!
    unsigned char *st = “12345”;
    CString str(st);或者CString str = st;完美!!!反过来,你直接传指针干嘛!!CString内部自动增长,unsigned char可不行,要用你也得先分配好TCHAR再用
    memcpy(st,str.GetString(),str.GetLength()*sizeof(TCHAR));这样才安全,否则可能改动CString类的内部!!!同时TCHAR处理了多字节与宽字节。前面几位都在干嘛呢?
    那个说编码转换的……与其用你的函数不如用API,再说CString的构造函数的存在根本就不需要你亲自调用API!
      

  10.   

    string str=str_tep.GetBuffer(0); 
    unsigned char *kkk=(unsigned char *)str.c_str();我就没见过这种用法,连std::string都出来了?mfc程序里标准库根本不应该出现,因为mfc的类功能上远强于标准库……你什么意思呢?与其用string中转,不如直接分配unsigned char的空间了,如果CString是UNICODE,即CStringW,无法直接赋给unsigned char,你也应该用CStringA中转!然后用memcpy或strcpy复制GetBuffer或者GetString的内容
      

  11.   

    这是我实现的String类,可接受TCHAR类型,即宽、多字节均可
    http://download.csdn.net/source/1652340
      

  12.   

    你要知道unsigned char 是单字节,CString是个字符串 ,双字节 使用如下函数做单双,双单字节转换。 
    void wchar2char( char * dest, wchar_t * src, int lim) 

        int nResult;     nResult = WideCharToMultiByte( 
            CP_ACP,    
            0, 
            src, 
            wcslen(src)+1, 
            dest, 
            0, 
            NULL, 
            FALSE); 
        if(nResult > 0) 
        { 
            nResult = WideCharToMultiByte( 
                CP_ACP,    
                0, 
                src, 
                wcslen(src)+1, 
                dest, 
                nResult, 
                NULL, 
                FALSE); 
        } 
    } void char2wchar( wchar_t * dest, char * src, int lim) 

        int nResult; 
        
        nResult = MultiByteToWideChar( 
            CP_ACP,    
            MB_PRECOMPOSED, 
            src, 
            strlen(src)+1, 
            dest, 
            0); 
        if (nResult > 0) 
        { 
            nResult = MultiByteToWideChar( 
                CP_ACP,    
                MB_PRECOMPOSED, 
                src, 
                strlen(src)+1, 
                dest, 
                nResult); 
        } 
    }