这类简单的东西,有时候不用就容易忘,每次用的时候都要搜一下,我自己记录下确认的一种方法吧
1 CString转化成char*
分两种情况,一种在ANSI字集,另一种是在Unicode字集
CString cstrPP=L"I am a boy!";
第一种在ANSI字集
char* p;
p=(char*)cstrPP.GetBuffer(cstrPP.GetLength());
另一种在Unicode字集
wchar_t 是unicode 类型,是宽字节
wchar_t* p;
p=(wchar_t*)cstrPP.GetBuffer(cstrPP.GetLength());
在用完GetBuffer()之后一定要用ReleaseBuffer()
2 char*转化成CString
char str[20]="GO GO!";
CString cstr;
cstr.Format("%s",str);
3将主机字节顺序转化为网络字节
htonl()表示将32位的主机字节顺序转化为32位的网络字节顺序 htons()表示将16位的主机字节顺序转化为16位的网络字节顺序(ip地址是32位的端口号是16位的 )
4将网络字节顺序转化成主机字节顺序
ntohs ntohl
从3和4可以看出 h代表host,n代表network,l代表long,s代表short
5IP地址格式转换(char*与struct in_addrin格式互换)
unsigned long PASCAL FAR inet_addr (const char FAR * cp);
char FAR * PASCAL FAR inet_ntoa (struct in_addr in);
inet_addr函数需要一个字符串作为其参数,该字符串指定了以点分十进制格式表示的IP地址(例如:192.168.0.16)。而且inet_addr函数会返回一个适合分配给S_addr的u_long类型的数值。
Inet_ntoa函数会完成相反的转换,它接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串。
6宽字符与多字节的转换(参考http://blog.csdn.net/xiaobai1593/article/details/7063535)
第一种方法是
mbstowcs()把多字节字符转换成宽字符
wcstombs()把宽字符转换成多字节 wide character to multibyte
第二种方法是
MultiByteToWideChar用于将多字节字符串转换成宽字符串
WideCharToMultiByte将宽字符串转换成等价的多字节字符串
两种函数同样有效
7现在有些默认的字集是Unicode编译器,比如说VS2005,在wince 6.0也是Unicode的字集,所以说要学会用Unicode字集的一些函数,这边就不细讲了,就附上一个链接http://blog.csdn.net/ccbuluo/article/details/8705667
CString也是宽字符吧,在有些环境当中
8Unicode下CString 转换成char*
先附上一个链接http://www.cnblogs.com/junyuz/archive/2011/08/24/2151857.html,这些方法我没有去试
我再补充一个自己能用的方法
CString cstr=L"I am best";
wchar_t* wstr=cstr.GetBuffer(cstr.GetLength());
char* ch=new char[cstr.GetLength())];
wcstombs(ch,wstr,cstr.GetLength());
ch[cstr.GetLength())]='\0';
用完要delete []ch;这个要养成好习惯
在这里补充一下字符的的概念,有关多字节、宽字符、unicode等概念
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一冰倩唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
UTF-8以变长的方式编码的,它可以使用1到4个字节表示一个字符,根据不同的符号变化用不同的字节表示。http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html这篇讲的通俗易懂
UTF-16和UTF-32分别以16位无符号整数、32位无符号整数位单位的。
还有关于网络字节顺序和主机字节顺序,大端和小端,可以上网搜一下,可以了解下
多字节是每个字符的编码宽度都不等,可以是一个字节,也可以是多个字节
宽字符,与多字节相反,所有的字符的字节数都相等