内存映射(读取二进制文件)

二进制文件中前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;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneOnce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值