当前位置: 代码迷 >> VC >> 带 \0 的char[] 转 CString,该怎么解决
  详细解决方案

带 \0 的char[] 转 CString,该怎么解决

热度:3531   发布时间:2013-02-25 00:00:00.0
带 \0 的char[] 转 CString
C#写的WebService,姓名是byte[]长度40 中文 用Encoding.Unicode.GetByte转的.C#中控制了长度最大20
VC.NET 2005 用ATLSOAP_BLOB接的.之后用 memcpy将复制到char Name[40]中.
这时候,直接将char Name[40]放到CString中,并且显示到static text中是一切正常的.
CString.Format(_T("%s"),Name);

问题出现在将char Name[40]用CFile存到文件以后,再取出来.
给CString的时候就出问题了.而且有之后转换的时候.char Name[40]里面都是中文就没问题
当有英文时,Encoding.Unicode.GetByte把英文转换后另外会留下一个\0但是%s就以\0结束了.还有用大写的%S也有问题
把部分代码贴出来希望大家帮忙.

我主要做C#的.不太了解VC.NET,还请多多包含.谢谢大家
另外以前也试过WChar也失败了.主要原因个人怀疑是文件存取后编码问题.
谢谢各位高手

C/C++ code
//1.首先,接收webservice的结构体struct WS_PERSON{    int PID;    ATLSOAP_BLOB ID;    ATLSOAP_BLOB SerialNumber;    ATLSOAP_BLOB Name;    WS_DATE EnrollmentDate;    WS_DATE Birthday;    BSTR Photo;    ATLSOAP_BLOB Address;    ATLSOAP_BLOB Telephone;    unsigned char Type;    unsigned char State;    ATLSOAP_BLOB MagcardNumber;    unsigned char MagcardState;    int Version;    int PhotoVersion;};//2.存取文件和显示的结构体// 学生或教师信息typedef struct _VCT_PERSON{    int            Id;                    // 编号    char        Key[36];            // 唯一标识    char        Code[20];            // 学号或工号//    WCHAR        Name[20];            // 姓名    char        Name[40];            // 姓名    VCT_DATA    EnrollmentDate;        // 入学时间    VCT_DATA    Birthday;            // 生日    WCHAR        Photo[200];            // 照片地址    //     WCHAR        Address[50];        // 地址    char        Address[100];        // 地址    uchar        Phone[20];            // 电话     char        Type;                // 学生/教师    char        State;                // 学生状态     char        CardId[16];            // 卡号     char        CardState;            // 卡号状态    int            Grade;                // 年级    int            Class;                // 班级    int            Version;            // 数据版本    int            PhotoVersion;        // 图片版本}VCT_PERSON,*LPVCT_PERSON;//3.两个结构体赋值的方法void ConvertToPerson(VCT_PERSON* dest,WS_PERSON* src){    // 编号    dest->Id=src->PID;    // 唯一标识    memcpy(dest->Key,src->ID.data,src->ID.size);    // 学号/工号    memcpy(dest->Code,src->SerialNumber.data,src->SerialNumber.size);    // 姓名    //_tcscpy(dest->Name,src->Name);    memset(dest->Name,0,sizeof(dest->Name));    memcpy(dest->Name,src->Name.data,src->Name.size);    // 入学日期    memcpy(&dest->EnrollmentDate,&src->EnrollmentDate,sizeof(dest->EnrollmentDate));    // 生日    memcpy(&dest->Birthday,&src->Birthday,sizeof(dest->Birthday));    // 照片地址    _tcscpy(dest->Photo,src->Photo);    // 联系地址    //_tcscpy(dest->Address,src->Address);    memset(dest->Address,0,sizeof(dest->Address));    memcpy(dest->Address,src->Address.data,src->Address.size);    // 联系电话    memcpy(dest->Phone,src->Telephone.data,src->Telephone.size);    // 人物类型    dest->Type=src->Type;    // 学生/教师状态    dest->State=src->State;    // 卡号    memcpy(dest->CardId,src->MagcardNumber.data,src->MagcardNumber.size);    // 卡状态    dest->CardState=src->MagcardState;    // 年级    dest->Grade=0;    // 班级    dest->Class=0;    // 数据版本    dest->Version=src->Version;    // 照片版本    dest->PhotoVersion=src->PhotoVersion;}//4.存取文件的方法//存BOOL CDBManager::SavePersonData(){    printf("[CDataManger::SavePersonData]\n");    CFile file;    if(!file.Open(PERSON_DB,CFile::modeCreate|CFile::modeReadWrite,NULL))    {        printf("[CDataManger::SavePersonData] open file failed!\n");        return false;    }    int count=Persons.GetSize();//Persons是VCT_PERSON的一个列表,CPtrArray类型    VCT_PERSON* p;    for (int i=0;i<count;i++)    {        p=(VCT_PERSON*)Persons.GetAt(i);        file.Write(p,sizeof(VCT_PERSON));    }        file.Close();    return true;}//取BOOL CDBManager::GetPersonData(VCT_PERSON* & data,int & dwsize){    printf("[CDataManger::GetPersonData]\n");    CFile file;        if(!file.Open(PERSON_DB,CFile::modeRead,NULL))    {        printf("[CDataManger::GetPersonData] open file failed!\n");        return false;    }    int filelen;    filelen=(int)file.GetLength();    if((filelen%sizeof(VCT_PERSON))!=0)    {        printf("[CDataManger::GetPersonData] file is ruinate!\n");        return false;    }    dwsize=filelen/sizeof(VCT_PERSON);    data=(VCT_PERSON* )malloc(filelen);    memset(data,0,filelen);    int  rcount=0;    while(rcount<filelen)    {        rcount+=file.Read(&data[rcount],filelen-rcount);    }    file.Close();    return true;}//4.给CString的赋值CString m_Person_Name;m_Person_Name.Format(_T("%s"),m_Person->Name);
  相关解决方案