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