验证ANCI和UNICODE编码

/
// 验证宽字节编码

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]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值