/
// 验证宽字节编码
wchar_t szProdVer[] = _T("河北12");
char szTemp[1024] = {0};
CStringA csTempA; // 结果:6cb353173132 -> 6cb3 + 5317 + 31 + 32
int nLen = wcslen(szProdVer); // 4
for (int i=0; i<nLen; i++)
{
sprintf(szTemp, "%x", szProdVer[i]);
csTempA += szTemp;
}
wchar_t chTemp = 0x6cb3; // "河"
int nWLen = sizeof(wchar_t); // 2
{
int len = WideCharToMultiByte(CP_ACP, 0, LPCWSTR(szProdVer), -1, NULL, 0, NULL, NULL);
char *str = new char[len];
memset(str, 0, len);
WideCharToMultiByte(CP_ACP, 0, LPCWSTR(szProdVer), -1, str, len, NULL, NULL);
CStringA cstrDestA = str;
delete[] str;
} // 等价于 CStringA(CString(szProdVer))
/
// 验证多字节编码
char szProdVerA[] = "河北12";
nLen = strlen(szProdVerA); // 6
CStringA csTempA2; // 结果:ffffffbaffffffd3ffffffb1ffffffb13132 -> ba + d3 + b1 + b1 + 31 + 32
for (int i=0; i<nLen; i++)
{
sprintf(szTemp, "%x", szProdVerA[i]);
csTempA2 += szTemp;
}
char chT1 = 0xba;
char chT2 = 0xd3;
char szT2[] = {chT1, chT2, 0}; // "河"
char chT3 = 0xb1;
char chT4 = 0xb1;
char szT4[] = {chT3, chT4, 0}; // "北"
注:
如果是有符号型变量,且该值二进制首位为1(如我们定义的是char buf[100],且buf[0]中为0xbf), 则会按照补码形式前面全置为1,也就是全为f。(因为终端显示的是8个十六机制数字;另外,我用Tobor C编译,因为Tobor C中int是2bytes,终端显示就成4个十六进制数字了:ffbf,因此我猜测,printf函数显示之前先将有符号型值转换成了一个4bytes的int。当然,这是函数内部的处理,跟我们所说的话题关系不大。)。按照上面述说的,如果把buf声明为unsigned char型,则显示会变成:bf
而且,如果程序需要讲一个有符号型的变量以十六进制形式输出,且只显示两位,可以强制类型转换为无符号型变量,如上面的buf[0],可以转换成:(unsigned char)buf[0]