內存映射(讀取二進制文件)

二進制文件中前4個字節爲文件的大小。前32-36個字節關於文件的格式,

格式之後爲4個通道的數據,分別爲:CH1/CH2/CH3/CH4

 

DWORD CTEST1Dlg::ReadDataFormIgnFile(TCHAR *tcFileName, const DWORD dwDataLen, USHORT *pCH1, USHORT *pCH2, USHORT *pCH3, USHORT *pCH4)
{
 HANDLE hFile = NULL, hMapFile = NULL;
 DWORD size_low = 0, size_high = 0;
 DWORD dwLeastDataLen = dwDataLen * 4 + 0x20, dwFilePos = 0, dwDataPos = 0, dwBufferLen = 0;
 BYTE ucTmpA = 0, ucDataLen[4] = {0}, ucCH_Num = 0;
 LPBYTE lpbFile = NULL;


 //獲得文件句柄
 hFile = CreateFile(tcFileName,   //文件名
                       GENERIC_READ, //對文件進行讀寫操作
                       FILE_SHARE_READ|FILE_SHARE_WRITE,
                       NULL,    
                       OPEN_EXISTING,  //打開已存在文件
                       FILE_ATTRIBUTE_NORMAL,  
                       0); 
 if (hFile == NULL)
 {
  return ID_ERROR;
 }

 //返回值size_high, size_low分別表示文件大小的高32位/低32位
 size_low = GetFileSize(hFile, &size_high);
 if ((size_high == 0) && (size_low < dwLeastDataLen) && (size_low == 0xFFFFFFFF))
 {
  return ID_ERROR;
 }

 //創建文件的內存映射文件。  
 hMapFile = CreateFileMapping(hFile,
                                 NULL,
                                 PAGE_READONLY,  //對映射文件進行讀寫
                                 size_high,   
                                 size_low,   //這兩個參數共64位,所以支持的最大文件長度爲16EB
                                 NULL);
 if(hMapFile == INVALID_HANDLE_VALUE)  
 {  
  //AfxMessageBox("Can't create file mapping.Error%d:/n",   GetLastError());  
  CloseHandle(hFile);
  return ID_ERROR;
 }

 //把文件數據映射到進程的地址空間
 lpbFile = (LPBYTE)MapViewOfFile(hMapFile,
                                    FILE_MAP_READ,
                                    0,
                                    0,
                                    0); 
 if (lpbFile == NULL)
 {
  CloseHandle(hMapFile);
  CloseHandle(hFile);
  return ID_ERROR;
 }

 dwFilePos = 0;
 dwFilePos += 0x20;
 memcpy(&ucDataLen, &lpbFile[dwFilePos], sizeof(ucDataLen));
 dwFilePos += sizeof(ucDataLen);
 dwBufferLen =  (ucDataLen[0] << 24) & 0x0FF000000;
 dwBufferLen |= (ucDataLen[1] << 16) & 0x0FF0000;
 dwBufferLen |= (ucDataLen[2] << 8 ) & 0x0FF00;
 dwBufferLen |= (ucDataLen[3] << 0 ) & 0x0FF;
 ucCH_Num = 4;
 dwBufferLen /= ucCH_Num;

 for (dwDataPos = 0; (dwDataPos < dwBufferLen) && (dwDataPos < dwDataLen); dwDataPos++)
 {  //待完整
  if (pCH1 != NULL)
  {
   pCH1[dwDataPos] = (BYTE)(lpbFile[dwFilePos + (ucCH_Num * dwDataPos) + 0] & 0x0FF);
  }
  if (pCH2 != NULL)
   pCH2[dwDataPos] = (BYTE)(lpbFile[dwFilePos + (ucCH_Num * dwDataPos) + 1] & 0x0FF);

  if (pCH3 != NULL)
   pCH3[dwDataPos] = (BYTE)(lpbFile[dwFilePos + (ucCH_Num * dwDataPos) + 2] & 0x0FF);

  if (pCH4 != NULL)
   pCH4[dwDataPos] = (BYTE)(lpbFile[dwFilePos + (ucCH_Num * dwDataPos) + 3] & 0x0FF);

 }


 //結束
 UnmapViewOfFile(lpbFile); //撤銷映射
 CloseHandle(hMapFile);
 CloseHandle(hFile); //關閉文件
 lpbFile = NULL;
 hMapFile = NULL;
 hFile = NULL;

 return dwDataPos;
}

發佈了32 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章