**MFC读取bin文件并以16进制显示出来**
最近由于项目需要。需要对目标板的bin文件进行修改后使用。所以就想自己写一个上位机小工具来进行操作,结果在做的过程中遇到了一些意想之外问题(本人MFC不熟,C++水平有限也是一个原因),查看了一博客文档,也比较碎片化,我还是将我最后的阶段性成果整理 发布出来,供大家参考,希望能对某些人有所帮助。
下面就是mfc界面和按键触发的处理函数,界面比较简单,就一个文本框一个按键
“打开”按键按下所调用的方法
/*点击了界面中的打开按钮,选择对应的bin文件,并且以16进制显示出来*/
void CreadfilenewDlg::OnBnClickedBtnOpen()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog filedlg(true,NULL,NULL, /*文件打开窗口个*/
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
_T("bin文件(*.bin)|*.bin") );
if (filedlg.DoModal() != IDOK )/*窗口不是按确定返回的*/
{
return;
}
CString filename, strtmp, strresult;
filename = filedlg.GetPathName(); /*获取要打开的文件名*/
strresult += _T("你输入的文件的名字是:\r\n");
strresult += filename;
strresult += _T("\r\n");
CFile readfile; /*定义CFile结构*/
readfile.Open(filename, CFile::modeReadWrite | CFile::typeBinary); /*以二进制读写形式打开文件*/
UINT len,lenk;
len = readfile.GetLength(); /*读取文件的长度*/
strtmp.Format(_T("%d"), len);
strresult += _T("你打开的文件的字节数是:\r\n");
strresult += strtmp;
strresult += _T("\r\n");
lenk = len / 1024; /*长度转换,修改为k字节为单位*/
strtmp.Format(_T("%d"), lenk);
strresult += _T("你打开的文件的大小是:\r\n");
strresult += strtmp;
strresult += _T("K\r\n");
UCHAR *ucharbuffer = new UCHAR[len](); /*由file读到buffer、buffer类型为unsigned char*/
readfile.Read(ucharbuffer, len);
readfile.Close();
strresult += _T("你打开的文件的内容是:\r\n");
for (UINT i = 0; i < len; i++) /*将buffer内容转换为16进制的字符串*/
{
strtmp.Format(_T("%.2x"), ucharbuffer[i]);
strtmp += _T(" "); /*空格隔开相邻字节*/
if ((i + 1) % 16 == 0) /*每16个字节为一行*/
{
strtmp += _T("\r\n");
}
strresult += strtmp;
}
//static CFont pnt; /*设置为新宋体,是为了显示字符的对齐*/
//pnt.CreatePointFont(140, _T("宋体")); /*移植到初始化方法BOOL CreadfilenewDlg::OnInitDialog()中,放在这会有重复打开报错*/
//GetDlgItem(IDC_EDITDISP)->SetFont(&pnt);
SetDlgItemTextW(IDC_EDITDISP, strresult); /*显示出来*/
delete ucharbuffer; /*释放空间*/
}
为了显示的16进制的时候能够列对齐,在初始化函数中所添加的代码
BOOL CreadfilenewDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
....
....
// TODO: 在此添加额外的初始化代码
static CFont pnt; /*设置为新宋体,是为了显示字符的对齐*/
pnt.CreatePointFont(140, _T("宋体"));
GetDlgItem(IDC_EDITDISP)->SetFont(&pnt);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
下面看下效果:
要打开的文件
用常用的UE阅读器打开后的内容显示
最后是我们所编写的上位机打开同一个文件的效果:
我检查过了,开头和结尾都对,中间内容没有一一核对,但应该也差不了,这个只是开始,后续我会继续添加相应的功能,如果大家有需要,我会将mfc工程打包挂出来