【C++】进制转换


前言

该程序用C++语言开发,主要用于转换不同格式的数据,包括十进制正码、 十进制反码、十六进制正码、十六进制反码。实现了输入以上一种格式数据,然后输出另外三种格式数据的功能。


一、转换函数

1.数据源是十进制正码

代码如下:(反码流程类似)

{
	// TODO: Add your control notification handler code here
	CString strInputFile = "";
	CFileDialog *lpszOpenFile = new CFileDialog(TRUE,"","",OFN_FILEMUSTEXIST |OFN_HIDEREADONLY , "文件类型(*.txt)|*.txt|所有文件(*.*)|*.*|");
	if(lpszOpenFile->DoModal() == IDOK )
	{
		strInputFile = lpszOpenFile->GetPathName();
	}

	delete lpszOpenFile;
	if (strInputFile.IsEmpty())
	{
		return;
	}

	CStdioFile fileInput;
	if(!fileInput.Open(strInputFile,CFile::modeRead)) 
	{
		return;
	}

	CFile fileOuput;
	fileOuput.Open(getModuleFile()+"\\_OutputFromDecp.txt", CFile::modeCreate|CFile::modeWrite,NULL);

	char szTitle[256];
	memset(szTitle, 0, 256);
	sprintf(szTitle, "%s,%s,%s,%s", "十进制正码", "十进制反码", "十六进制正码", "十六进制反码");
	fileOuput.Write(szTitle, strlen(szTitle));
	fileOuput.Write(_T("\r\n"), 2);

	int len = 0;
	char szbuff[256];
	
	char szdecp[64];
	char szdecn[64];
	char szhexp[64];
	char szhexn[64];
	
	CString strLine;
	while(fileInput.ReadString(strLine))
	{
		strLine.GetBufferSetLength(strLine.GetLength());
		if (strLine.IsEmpty())
			continue;

		memset(szbuff, 0, 256);
		memcpy(szbuff, strLine, strlen(strLine));
		
		memset(szdecp, 0, 64);
		memset(szdecn, 0, 64);
		memset(szhexp, 0, 64);
		memset(szhexn, 0, 64);
		
		dec2reverse(szbuff, szdecn, len);
		dec2reverse(szdecn, szdecp, len);
		dec2hex(szdecp, szhexp, len);
		dec2hex(szdecn, szhexn, len);

		memset(szbuff, 0, 256);
		sprintf(szbuff, "%s,%s,%s,%s", szdecp, szdecn, szhexp, szhexn);

		fileOuput.Write(szbuff, strlen(szbuff));
		fileOuput.Write(_T("\r\n"), 2);
	}

	fileOuput.Close();
	fileInput.Close();
}

2.数据源是十六进制正码

代码如下:(反码流程类似)

{
	// TODO: Add your control notification handler code here
	CString strInputFile = "";
	CFileDialog *lpszOpenFile = new CFileDialog(TRUE,"","",OFN_FILEMUSTEXIST |OFN_HIDEREADONLY , "文件类型(*.txt)|*.txt|所有文件(*.*)|*.*|");
	if(lpszOpenFile->DoModal() == IDOK )
	{
		strInputFile = lpszOpenFile->GetPathName();
	}
	
	delete lpszOpenFile;
	if (strInputFile.IsEmpty())
	{
		return;
	}
	
	CStdioFile fileInput;
	if(!fileInput.Open(strInputFile,CFile::modeRead)) 
	{
		return;
	}
	
	CFile fileOuput;
	fileOuput.Open(getModuleFile()+"\\_OutputFromHexp.txt", CFile::modeCreate|CFile::modeWrite,NULL);

	char szTitle[256];
	memset(szTitle, 0, 256);
	sprintf(szTitle, "%s,%s,%s,%s", "十进制正码", "十进制反码", "十六进制正码", "十六进制反码");
	fileOuput.Write(szTitle, strlen(szTitle));
	fileOuput.Write(_T("\r\n"), 2);

	int len = 0;
	char szbuff[256];
	
	char szdecp[64];
	char szdecn[64];
	char szhexp[64];
	char szhexn[64];

	CString strLine;
	while(fileInput.ReadString(strLine))
	{
		strLine.GetBufferSetLength(strLine.GetLength());
		if (strLine.IsEmpty())
			continue;

		memset(szbuff, 0, 64);
		memcpy(szbuff, strLine, strlen(strLine));
		
		memset(szdecp, 0, 64);
		memset(szdecn, 0, 64);
		memset(szhexp, 0, 64);
		memset(szhexn, 0, 64);
		
		hex2reverse(szbuff, szhexn, len);
		hex2reverse(szhexn, szhexp, len);
		hex2dec(szhexp, szdecp, len);
		hex2dec(szhexn, szdecn, len);
		
		memset(szbuff, 0, 256);
		sprintf(szbuff, "%s,%s,%s,%s", szdecp, szdecn, szhexp, szhexn);
		
		fileOuput.Write(szbuff, strlen(szbuff));
		fileOuput.Write(_T("\r\n"), 2);
	}
	
	fileOuput.Close();
	fileInput.Close();
}

二、辅助函数

1.十进制反序(正码/反码)

代码如下:

void dec2reverse(const char *szIn, char *szOut, int &len)
{
	if (!IsDec(szIn))
		return;

	char szbuff[64];
	memset(szbuff, 0, 64);
	
	if (strlen(sztemp)%2==0) {
		sprintf(&szbuff[0], "%X", atol(szIn));
		len = strlen(szbuff);
	}
	else  {
		sprintf(&szbuff[1], "%X", atol(szIn));
		len = strlen(szbuff);
	}
	
	char ch;
	for (int i=0;i<len/2;i+=2)
	{
		ch = szbuff[i];
		szbuff[i] = szbuff[len-i-2];
		szbuff[len-i-2] = ch;
		ch = szbuff[i+1];
		szbuff[i+1] = szbuff[len-i-1];
		szbuff[len-i-1] = ch;
	}
	
	long lVal = HexToUINT64(szbuff);

	memset(szbuff, 0, 64);
	sprintf(szbuff, "%u", lVal);
	
	if (strlen(szbuff)<10) {
		sprintf(szOut, "%0*d%u", 10 - strlen(szbuff), 0, lVal);
		len = strlen(szOut);
	}
	else {
		sprintf(szOut, "%u", lVal);
		len = strlen(szOut);
	}
}

2.十六进制反序(正码/反码)

代码如下:

void hex2reverse(const char *szIn, char *szOut, int &len)
{
	if (!IsHex(szIn))
		return;
	
	char szbuff[64];
	memset(szbuff, 0, 64);

	if (strlen(szIn)%2==0) {
		memcpy(&szbuff[0], szIn, strlen(szIn));
		len = strlen(szbuff);
	}
	else {
		memcpy(&szbuff[1], szIn, strlen(szIn));
		len = strlen(szbuff);
	}

	char ch;
	for (int i=0;i<len/2;i+=2)
	{
		ch = szbuff[i];
		szbuff[i] = szbuff[len-i-2];
		szbuff[len-i-2] = ch;
		ch = szbuff[i+1];
		szbuff[i+1] = szbuff[len-i-1];
		szbuff[len-i-1] = ch;
	}
	
	int tlen = 8-strlen(szbuff);
	if (tlen>0) {
		sprintf(&szOut[0], "%0*d", tlen, 0);
		sprintf(&szOut[tlen], "%s", szbuff);
		len = strlen(szOut);
	}
	else {
		memcpy(szOut, szbuff, strlen(szbuff));
		len = strlen(szOut);
	}
}

3.十进制转十六进制

代码如下:

void dec2hex(const char *szIn, char *szOut, int &len)
{
	if (!IsDec(szIn))
		return;

	char szbuff[64];
	memset(szbuff,0,64);
	sprintf(szbuff, "%X", atol(szIn));

	int tlen = 8-strlen(szbuff);
	if (tlen>0) {
		sprintf(&szOut[0], "%0*d", tlen, 0);
		sprintf(&szOut[tlen], "%s", szbuff);	
		len = strlen(szOut);
	}
	else {
		memcpy(szOut,szbuff,strlen(szbuff));
		len = strlen(szOut);
	}
}

4.十六进制转十进制

代码如下:

void hex2dec(const char *szIn, char *szOut, int &len)
{
	if (!IsHex(szIn))
		return;

	long lVal = HexToUINT64(szIn);

	char szbuff[64];
	memset(szbuff, 0, 64);
	sprintf(szbuff, "%u", lVal);

	if (strlen(szbuff)<10) {
		sprintf(szOut, "%0*d%u", 10 - strlen(szbuff), 0, lVal);
		len = strlen(szOut);
	}
	else {
		sprintf(szOut, "%u", lVal);
		len = strlen(szOut);
	}
}

三、示例数据

1.输入数据

在这里插入图片描述

2.输出数据

在这里插入图片描述


总结

实现了数据转换的基本需求,但是代码看起来有点冗余~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值