使用 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;
[解决办法]
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个字节的数据错误
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;}