读书人

应用 WideCharToMultiByte 个别字符出

发布时间: 2012-11-08 08:48:11 作者: rapoo

使用 WideCharToMultiByte 个别字符出现乱码

最近利用代码读取NTFS磁盘的文件名时,发现读出的文件名大部分正常,但少部分会出现乱码,如:

越玩越聪明全集-全世界聪明人都在玩的1001个全脑思维游戏.pdf 变成
越玩越聪明全$-全世界聪明人都在玩的1001个全脑思维游戏.pdf


身体语言:从他人的身体姿势了解其内心世界.pdf 变成
身体语言:从他人的身体姿势了解其内心世界.p$f


请问这是什么原因呢,下面的代码



int len = buffer[off_index + 80]; //文件名长度,unsigned char buffer[4096];unsigned int off_index

WCHAR* name_unicode = new WCHAR[len + 1];
for (int i = 0; i < len; i++)
name_unicode[i] = buffer[off_index + 82 + 2 * i] + buffer[off_index + 82 + 2 * i + 1] * 256;

name_unicode[len] = NULL;
DWORD dwNum = 0;




char* psText;
psText = new char[dwNum + 1];
WideCharToMultiByte(CP_OEMCP , NULL, name_unicode, -1, psText, dwNum, NULL, FALSE);
psText[dwNum ] = '\0';

MessageBox(NULL,psText,psText,MB_OK); <-----------------乱码从这里看出来
CString f;
f.Format("%s", psText);

delete []psText;
delete []name_unicode;



[解决办法]

C/C++ code
wchar_t szText[] = L"越玩越聪明全集-全世界聪明人都在玩的1001个全脑思维游戏.pdf";    char* buf = NULL;    int len = WideCharToMultiByte(CP_ACP, 0, szText, -1, buf, 0, NULL, NULL);    buf = new char[len];    WideCharToMultiByte(CP_ACP, 0, szText, -1, buf, len, NULL, NULL);    AfxMessageBox(CString(buf));    delete[] buf;    buf = NULL;
[解决办法]
ntfs磁盘扇区的数据需要把USN数据重写回去, 否则每个扇区将会有2个字节的数据错误

C/C++ code
typedef struct _MFT_FILE_HEADER{    union    {        DWORD        dwMagic;        //00 "FILE"        CHAR        szMagic[4];            };    WORD        wOffsetOfUS;        //04 Offset of Update Sequence 更新序列号的偏移    WORD        wSizeOfUS;            //06 Size in words of Update Sequence Number & Array 更新序列号的大小与数组    ULONGLONG    uuLSN;                //08 $LogFile Sequence Number 日志文件序列号    WORD        wSeqNo;                //10 Sequence number The increment is done when the file is deleted.     WORD        wHardlinks;            //12 Hard link count 硬连接数,即有多少目录指向该文件    WORD        wOffsetOfAttr;        //14 Offset of the first Attribute 第一个属性的偏移    WORD        wFlags;                //16 Flags 文件被删除后FLAG=0    DWORD        dwRealSize;            //18 Real size of the FILE record 这个文件记录中已用的大小    DWORD        dwAllocSize;        //1C Allocated size of the FILE record    ULONGLONG    uuRefToBase;        //20 File reference to the base FILE record 基本文件记录中的文件索引号    WORD        wNextAttrId;        //28 Next Attribute Id 下一属性ID    WORD        wAlign;                //2A Align to 4 byte boundary    DWORD        dwRecordNo;            //2C Number of this MFT Record}MFT_FILE_HEADER;    //    size:0x30BOOL    CNtfsMFT::ReadMft(CHAR cVolume, ULONGLONG uuMftIndex){    BOOL        bRetVal;    DWORD        dwSectors;    WORD        wUSNCheck;    WORD *        pUSNTable;    AllocMftHead(cVolume);    bRetVal = m_pDiMgr->ReadMtf(cVolume, uuMftIndex, m_pHead);    if(bRetVal == FALSE)    {        assert(0);        return FALSE;    }    m_uuMftIndex = uuMftIndex;    dwSectors = m_pCurVolume->m_dwBytePreMtf / m_pCurVolume->m_BootDat.NtfsBoot.BytesPerSector;    pUSNTable = (WORD*)((BYTE*)m_pHead + m_pHead->wOffsetOfUS);    wUSNCheck = *pUSNTable;    pUSNTable ++;    bRetVal = UpdateByUSN(m_pHead, dwSectors, wUSNCheck, pUSNTable);    if(bRetVal == FALSE)    {        assert(0);        return FALSE;    }    return bRetVal;}BOOL    CNtfsMFT::UpdateByUSN(VOID *pData, DWORD dwSectors, WORD wUSNCheck, WORD *pUSNTable){    BYTE *        pDatWrite;    DWORD        i;    DWORD        dwSectorSize;    dwSectorSize = m_pCurVolume->m_BootDat.NtfsBoot.BytesPerSector;    pDatWrite = (BYTE *)pData;    pDatWrite += dwSectorSize - 2;    for(i=0; i<dwSectors; i++)    {        if(*(WORD *)pDatWrite != wUSNCheck)        {            assert(0);            return FALSE;        }        *(WORD *)pDatWrite = pUSNTable[i];        pDatWrite += dwSectorSize;    }    return TRUE;} 

读书人网 >VC/MFC

热点推荐