进制转换
前言
该程序用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.输出数据
总结
实现了数据转换的基本需求,但是代码看起来有点冗余~