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