以下内容仅供参考
萌新学习中尝试的几种方法,对原理不太熟悉,不能保证全部正确。
1、unsigned char*
unsigned char* 转 char*:
char* cData = (char*)ucData;
unsigned char* 转 string:
string sOut = reinterpret_cast<const char*>(ucOut);
unsigned char* 转 CString:
CString csTxt = (CStringW)ucTxt;
2、char*
char* 转 unsigned char*:
unsigned char* ucIn = (unsigned char*)cImagePath;
// 或:
unsigned char* ucIn = reinterpret_cast<unsigned char*> (cImagePath);
char* 转 string:
string sOut = cData;
char* 转 CString:
// ①、定义时赋值:
CString csFileName = CA2W(cImageType);
// 或:
CString csFileName(cImageType);
// ②、拼接CString时:
csFileName = csFileName + CA2W(cImageType);
// ③、定义后赋值:
csFileName = cImageType;
3、string
string 转 const char*:
const char* cImageType = sImageType.c_str();
string 转 char[]:
string s = "12345";
char c[6];
strcpy(c, s.c_str());
string 转 unsigned char*:
unsigned char* ucTxt = (unsigned char*)sTxt.c_str();
string 转 CString:
// ①、定义时赋值:
CString csFileName = CA2W(sFileName.c_str());
// ②、定义后赋值:
csFileName = sFileName.c_str();
// (使用的是=运算符的重载)
4、CString
CString 转 string:
string sTxt = CW2A(csTxt);
// (省略了csTxt.GetString(),好像没问题)
// 或:
string sTxt = CStringA(csTxt);
CString 转 char*:
CString cstr = _T("123");
int len = WideCharToMultiByte(CP_ACP, 0, cstr, -1, NULL, 0, NULL, NULL);
char* ptxtTemp = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, cstr, -1, ptxtTemp, len, NULL, NULL);
ptxtTemp[len] = '\0';
// 或:
USES_CONVERSION;
char* cTest = W2A(csTest);
CString 转 unsigned char*:
USES_CONVERSION;
unsigned char* cTest = (unsigned char*)W2A(csTest);
另外,CString 在定义时赋定值,如:
CString str = _T("hello");
// 或:
CString p = L"123";
5、其他
CW2A 将宽字符集(Unicode)转化为多字符集(ASCII)
CA2W 将多字符集(ASCII)转化为宽字符集(Unicode)
USES_CONVERSION是ATL中的一个宏定义。用于编码转换(用的比较多的是CString向LPCWSTR转换)
MultiByteToWideChar 多字节转宽字节
WideCharToMultiByte 宽字节转多字节
不能将字符串常量赋值给字符数组(除非是定义时赋值):
struct S
{
char name[10];
};
int main()
{
S a;
a.name = "abc";
}
编译器报错“表达式必须为可修改的左值”。原因:不能将字符串常量赋值给字符数组(除非是定义时赋值!如char a[10] = “abc”)。同样的,字符数组也不能赋值给字符数组。因为name作为数组名,是一个指针常量,储存了这个字符数组的起始地址,不可指向其他字符串、字符数组的地址,不然成了内存泄漏。
解决方法有非常多种:
①使用string替代字符数组。
②使用strcpy函数:strcpy(a.name, "abc");
③使用字符指针:char *name;