数据采用16位存储,默认低四位为0,即高12位有效。例如,某采集通道转换数据为6FF,实际存储数据为6FF0。
因为现在数据是测试的随机数,所以不能从画出的图上看结果是否正确。我现在打开了文件
HANDLE hFile=::CreateFile(FileDlg.GetPathName(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
ASSERT(hFile!=NULL);
HANDLE hMap=::CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
ASSERT(hMap!=NULL);
WORD* lpvFile=(WORD *)::MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);然后针对每一个WORD数据,我按下面方法读
 m_Signal_CM1[i]=(float)(short)( ( lpvFile[8 * i ] >> 4 ) & 0xffff );

解决方案 »

  1.   

    (float)方式为自动转换类型..这个方式编译器是要换算的.
      

  2.   

    WORD* lpvFile;
    既然lpvFile为WORD型,lpvFile[8 * i ]便不是针对每一个WORD了,而是8个WORD之后了。m_Signal_CM1[i]=(float)(short)( ( lpvFile[i ] >> 4 ) & 0xffff );
    即可
      

  3.   

    [Quote=引用 7 楼 gao_zilai 的回复:]
    WORD* lpvFile;
    既然lpvFile为WORD型,lpvFile[8 * i ]便不是针对每一个WORD了,而是8个WORD之后了。其实也不是8个WORD之后,而是每隔8个WORD来一次了不过这个应该可行C/C++ codem_Signal_CM1[i]=(float)(short)( ( lpvFile[i ] >> 4 ) & 0xffff );即可
      

  4.   

    同意7L,不过不知道前边的float干嘛用的?
    还有LZ,别人都是把有效数据放在低位,你干嘛放高位啊?这样做会有问题。
      

  5.   

    对每个word进行处理的,话,那个8*就可以不要了
      

  6.   

    又开一贴?真的不希望你用内存映射,这是简单问题复杂化。给你写几句参考代码:
    CFile f;
    f.Open(FileDlg.GetPathName(),CFile::modeRead);
    int n = f.GetLength();
    WORD*buf = new WORD[n/sizeof(WORD)+1];
    f.Read((BYTE*)buf,n);
    f.Close()然后在循环中
    m_Signal_CM1[i]=(float)( buf[i] >> 4 );
    你那个&0XFFFF没有用。最后delete [] buf;不要以为这 new 和 delete 使用了额外的内存,你那个映射文件同样也用了。