to NowCan:
   能说的详细一点吗?
to a813(周):
   定义过了,但是没有用。大家都发表一点意见嘛,我现在好茫然啊……

解决方案 »

  1.   

    ANSI->UNICODE
    例如:
    一个字符串“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);
      

  2.   

    TO  dennis_duan(badrabbit) :
    感谢提供这个思路,我再试一下。请问哪里可以找到《WINDOWS 核心编程》一书的电子文档?我想下载看看。
      

  3.   

    其实你用_T"Nhsoft"就可以生成一个UNICODE 字符串了,一个字符用L'',好象《WINDOWS 核心编程》没有电子版的吧?
      

  4.   

    char字符串,加密后变成编码在0——255之间的字符串,我要将其转化成 BSTR 的UNICODE 传出,然后再传入进行解密,事情就这么简单,但是 0——255 之间的密文就是还不了原,所以没有办法正确解密,算法已经证明是正确的,就是在转化的时候,简直是黔驴技穷、一筹莫展……望各位多提宝贵意见。
      

  5.   

    放到CString里面,然后用CString::AllocSysString()转成BST
      

  6.   

    看来还是上次的问题啊?
    主要问题好像是:因为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;过去也可以, 反正接受的时候自己清楚就可以了。
      

  7.   

    写漏了;
    CHAR lpANSI[COUNT];
    WCHAR lpUnicode[COUNT];
    int i = 0; 
    while(lpANSI[i] != '\0' ) {
        lpUnicode[i] = (WCHAR)lpANSI[i];
        i++;
    }
    lpUnicode[i] = L'\0';
      

  8.   

    to In355Hz(好象一条狗):
      呵呵,的确是上次的问题。非常感谢你一直的关注并提供思路。今天早上,在我几乎绝望的时候终于搞定了,现在我还不知道是怎么回事,但是转换已经是正确的了,我的做法如下:
       char传入经过加密后是 0——255之间,于是我就用函数 mbstowcs()将其向宽字符转化后传出,其转换的结果让我感到惊喜,竟然将大于 0x87的字符也转化成了 XX 00 XX 00 的格式,
    再传入的时候由于 char 也不能接受大于0x7F 的字符,我就改用CHAR(0——255)来代替char进行转化,得到CHAR的结果和原来密文的结果是一样的,所以解密能顺利进行。
       虽然问题解决了,但是对函数mbstowcs()还是挺茫然的,主要是对宏A2W()之类以及API 为什么都不能实现这种转化?如果我不是无意中发现这个函数,岂不是要翘在这里?呵呵,说的有点严重。    多谢各位 , 非常乐意和大家交个朋友,我的邮箱是:[email protected]        今晚给分!
      

  9.   

    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,结果没有找到。
      

  10.   

    to In355Hz(好象一条狗):
      原来如此啊,哎,要是我早看到你的 pUnicode[i] = (WCHAR)lpANSI[i] 大作,就不至于搞的如此狼狈啦,……
       再次感谢,分数已经送出,往后请多关照。