MFC读取bin文件并以16进制显示出来

															**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工程打包挂出来
在这里插入图片描述

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值