自己做了一个小程序,是把一个二进制文件内容显示到对话框中的编辑框中,就像一些十六进制编辑工具一样,我的思路是将文件内容存到一个动态创建的byte数组中,然后将数组的每一个元素格式化成十六进制后加到编辑框中,由于读取到的一个字节有可能是小于10(十六进制),如果不对读取到的一个数A格式化成0A那就不是我的要求了,比如我要显示成的格式为:
11 01 02 03 AA FF
而不是11 1 2 3 AA FF
这问题就出来了,如果我对byte数组这样进行处理的话,要读取一个不太长的文件却要运行很长的时间,以致MFC程序无法响应了,请问大家,有没有什么好的办法来实现这样的功能?Notepad++读取二进制文件并显示速度很快是怎么做到的呢

解决方案 »

  1.   

    用多线程读取
    格式化用
    unsigned char ch = 0x02;
    printf("%.2x",ch);
    参考
      

  2.   

    %02xprintf("%02x ",18);18正好在十六进制中占两位,故显示为12; 
    printf("%02x ",15);15在十六进制中只占一位,则显示0f; 
      

  3.   

    用多线程我也用过,连设置一个定时器隔一段时间读十几个字符也试过,虽然不会卡死了,但运行速度还是太慢,还有由于CString遇到0就结束了,因为我读取的文件有很有字节是0的,所以似乎我不得不对它进行处理了,而且不单要处理,我还要每显示一字节后显示一个空格。
      

  4.   

    按照下面方法速度加快了许多,各位高手看看有什么可改进的方法,下面程序有个问题,就是运行时有点耗内存,DWORD WINAPI Pro(LPVOID lpParameter)是一个线程,lpParameter传进来的是一个HWND指针,同时定义了一个自定义消息,实现方法为OnFinished
    double per;
    CString m_data;
    HANDLE hMutex;
    DWORD WINAPI Pro( LPVOID lpParameter)
    {
    CFile m_file;
    char temp[4];
    m_data="";
    per=0;
    m_file.Open("out.bmp",CFile::modeRead|CFile::typeBinary);
    int len=m_file.GetLength();
    byte *data=new byte[len];
    m_file.Read(data,len);
    m_file.Close();
    ((CEdit*)((CWnd::FromHandle(*(HWND*)lpParameter))->GetDlgItem(IDC_DATA)))->SetLimitText(len*3);
    hMutex=CreateMutex(NULL,FALSE,NULL);
    for(int i=0;i<len;i++)
    {

    sprintf(temp,"%02X ",data[i]);
    WaitForSingleObject(hMutex,INFINITE);
    m_data+=temp;
    ReleaseMutex(hMutex);
    if((i+1)%10000==0)
    {
    per=100.0*(i+1)/len;
    ::SendMessage(*(HWND*)lpParameter,WM_FINISHED,WPARAM(&m_data),(LPARAM)&per);
    }

    }

    per=100.0*((i+1)/len);
    ::SendMessage(*(HWND*)lpParameter,WM_FINISHED,WPARAM(&m_data),(LPARAM)&per);
    ((CEdit*)((CWnd::FromHandle(*(HWND*)lpParameter))->GetDlgItem(IDC_DATA)))->SetSel(0,53*3);
    m_data="";

    return 0;
    }
    void CReadfileDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    HANDLE hThread;
    hThread=CreateThread(NULL,0,Pro,LPVOID(&m_hWnd),0,NULL);
    CloseHandle(hThread);
    }void CReadfileDlg::OnFinished(WPARAM wParam, LPARAM lParam)
    {
    WaitForSingleObject(hMutex,INFINITE);
    CString finish;
    finish.Format("完成%f",*(double*)lParam);
    finish+="%";
    GetDlgItem(IDC_FINISH)->SetWindowText(finish);
    GetDlgItem(IDC_DATA)->SetFocus();
    int len=GetDlgItem(IDC_DATA)->GetWindowTextLength();
    ((CEdit*)GetDlgItem(IDC_DATA))->SetSel(len,len);
    ((CEdit*)GetDlgItem(IDC_DATA))->ReplaceSel(*((CString *)wParam));

    m_data="";
    ReleaseMutex(hMutex);
    }