to In355Hz(好象一条狗): 呵呵,的确是上次的问题。非常感谢你一直的关注并提供思路。今天早上,在我几乎绝望的时候终于搞定了,现在我还不知道是怎么回事,但是转换已经是正确的了,我的做法如下: char传入经过加密后是 0——255之间,于是我就用函数 mbstowcs()将其向宽字符转化后传出,其转换的结果让我感到惊喜,竟然将大于 0x87的字符也转化成了 XX 00 XX 00 的格式, 再传入的时候由于 char 也不能接受大于0x7F 的字符,我就改用CHAR(0——255)来代替char进行转化,得到CHAR的结果和原来密文的结果是一样的,所以解密能顺利进行。 虽然问题解决了,但是对函数mbstowcs()还是挺茫然的,主要是对宏A2W()之类以及API 为什么都不能实现这种转化?如果我不是无意中发现这个函数,岂不是要翘在这里?呵呵,说的有点严重。 多谢各位 , 非常乐意和大家交个朋友,我的邮箱是:[email protected] 今晚给分!
mbstowcs是标准库的函数,以下是MSDN上的: The mbstowcs function converts count or fewer multibyte characters pointed to by mbstr to a string of corresponding wide characters that are determined by the current locale. The default locale-string is "C". The "C" locale maps each character in the string to its value as a wchar_t (unsigned short). 如果没有用#pragma setlocale( "locale-string" )设置local的话,current local == default local == "C"。 这样mbstowcs就直接maps每一个char到相同值的wchar_t,这就和我的lpUnicode[i] = (WCHAR)lpANSI[i];是一样的了,哎,昨天我还在找MultiByteToWideChar是不是有一个转换纯ANSI的code-page,结果没有找到。
to In355Hz(好象一条狗): 原来如此啊,哎,要是我早看到你的 pUnicode[i] = (WCHAR)lpANSI[i] 大作,就不至于搞的如此狼狈啦,…… 再次感谢,分数已经送出,往后请多关照。
例如:
一个字符串“aaaaa”转换后的结果是“a\0a\0a\0a\0a\0”使用MultiByteToWideChar和WideCharToMultiByte可以将Unicode字符串和Ansi字符串互相转换,下面是一段Ansi 2 Unicode转换的代码,详见《Windows核心编程》 PWSTR pWideCharStr;
int nLenOfWideCharStr; UpdateData(TRUE);
LPCTSTR pMultiByteStr = (LPCTSTR)m_AnsiStr;
nLenOfWideCharStr = MultiByteToWideChar(CP_ACP, 0,
pMultiByteStr, -1, NULL, 0); pWideCharStr = (PWSTR)HeapAlloc(GetProcessHeap(), 0,
nLenOfWideCharStr * sizeof(WCHAR)); if(pWideCharStr == NULL)
return; MultiByteToWideChar(CP_ACP, 0, pMultiByteStr, -1,
pWideCharStr, nLenOfWideCharStr); m_UnicodeStr = (CString)pWideCharStr;
UpdateData(FALSE); HeapFree(GetProcessHeap(), 0, pWideCharStr);
感谢提供这个思路,我再试一下。请问哪里可以找到《WINDOWS 核心编程》一书的电子文档?我想下载看看。
主要问题好像是:因为ANSI转UNICODE,如果使用A2W或MultiByteToWideChar(第一个参数是CP_ACP)的话,是根据系统默认的转码表,把转入的ANSI字符串看作Multi-Bytes字符串处理的,如果是中文(中文windows默认就是中文),一个大于0x87的byte可能和下一byte一起被看作一个汉字,然后根据汉字的Unicode编码转换为相同的Unicode汉字,如果找不到相应的编码,一般就用一个默认的字符来取代它(一般是问号“?”),由此看,如果随便把一段数据给他转,转化很复杂而且极可能不可逆,而且你加密过的ANSI码是相当混乱的有很多〉0x87的byte,转换就变得不可逆了。
建议自己直接就这样写:
CHAR lpANSI[COUNT];
WCHAR lpUnicode[COUNT];
int i = 0;
while(lpANSI[i] != '\0' ) {
lpUnicode[i] = (WCHAR)lpANSI[i];
}
lpUnicode[i] = L'\0';
然后按相同的方法转回来,因为对于0~0x87的ANSI字符串,对应的Unicode码就是相同的16位值,至于其他的,你的字符串反正加了密,没必要转换成显示出来是一样的字符,就按同样的方法处理了,其实如果中间的字符串不用显示或别的,直接reutrn (LPWSTR)lpANSI;过去也可以, 反正接受的时候自己清楚就可以了。
CHAR lpANSI[COUNT];
WCHAR lpUnicode[COUNT];
int i = 0;
while(lpANSI[i] != '\0' ) {
lpUnicode[i] = (WCHAR)lpANSI[i];
i++;
}
lpUnicode[i] = L'\0';
呵呵,的确是上次的问题。非常感谢你一直的关注并提供思路。今天早上,在我几乎绝望的时候终于搞定了,现在我还不知道是怎么回事,但是转换已经是正确的了,我的做法如下:
char传入经过加密后是 0——255之间,于是我就用函数 mbstowcs()将其向宽字符转化后传出,其转换的结果让我感到惊喜,竟然将大于 0x87的字符也转化成了 XX 00 XX 00 的格式,
再传入的时候由于 char 也不能接受大于0x7F 的字符,我就改用CHAR(0——255)来代替char进行转化,得到CHAR的结果和原来密文的结果是一样的,所以解密能顺利进行。
虽然问题解决了,但是对函数mbstowcs()还是挺茫然的,主要是对宏A2W()之类以及API 为什么都不能实现这种转化?如果我不是无意中发现这个函数,岂不是要翘在这里?呵呵,说的有点严重。 多谢各位 , 非常乐意和大家交个朋友,我的邮箱是:[email protected] 今晚给分!
The mbstowcs function converts count or fewer multibyte characters pointed to by mbstr to a string of corresponding wide characters that are determined by the current locale.
The default locale-string is "C". The "C" locale maps each character in the string to its value as a wchar_t (unsigned short).
如果没有用#pragma setlocale( "locale-string" )设置local的话,current local == default local == "C"。
这样mbstowcs就直接maps每一个char到相同值的wchar_t,这就和我的lpUnicode[i] = (WCHAR)lpANSI[i];是一样的了,哎,昨天我还在找MultiByteToWideChar是不是有一个转换纯ANSI的code-page,结果没有找到。
原来如此啊,哎,要是我早看到你的 pUnicode[i] = (WCHAR)lpANSI[i] 大作,就不至于搞的如此狼狈啦,……
再次感谢,分数已经送出,往后请多关照。