⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 idcalculate.cpp

📁 CAN网测试工具的源代码
💻 CPP
字号:
// IDCalculate.cpp : implementation file
//

#include "stdafx.h"
#include "test.h"
#include "IDCalculate.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CIDCalculate dialog


CIDCalculate::CIDCalculate(CWnd* pParent /*=NULL*/)
	: CDialog(CIDCalculate::IDD, pParent)
{
	//{{AFX_DATA_INIT(CIDCalculate)
	m_strIDByte = _T("");
	m_bExtFrameType = false;
	//}}AFX_DATA_INIT
}


void CIDCalculate::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CIDCalculate)
	DDX_Text(pDX, IDC_EDIT_ID, m_strIDByte);
	DDV_MaxChars(pDX, m_strIDByte, 12);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CIDCalculate, CDialog)
	//{{AFX_MSG_MAP(CIDCalculate)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIDCalculate message handlers

void CIDCalculate::OnOK() 
{
	// TODO: Add extra validation here
    UpdateData(TRUE);
    ConvertFromIDByteToID(m_strIDByte,m_strID);

	CDialog::OnOK();
}

BOOL CIDCalculate::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CIDCalculate::ConvertFromIDByteToID(CString strIDByte,CString &strID)
{
	unsigned char Data[4] = {0,0,0,0};
	char szData[25];
	BYTE datalen=0;
	
	if(strIDByte.GetLength()==0)
	{
		AfxMessageBox("请输入数据!");
		return;
	}
	
	if(strIDByte.GetLength()>12)
	{
		AfxMessageBox("ID值超过范围!");
		return;
	}

	datalen=(strIDByte.GetLength()+1)/3;
	strcpy(szData,(LPCTSTR)strIDByte);
	strtodata((unsigned char*)szData,Data,datalen,1);
    
	unsigned int iID;
	unsigned char* p = NULL;
	p = (unsigned char*)&iID;
	*(p + 3) = Data[0];
	*(p + 2) = Data[1];
	*(p + 1) = Data[2];
	*(p + 0) = Data[3];

	if(m_bExtFrameType)
		iID = iID >> 3;
	else
		iID = iID >> 5;

	CString strTem;
	strTem.Format("%x",iID);
	strID = strTem;
}

void CIDCalculate::ConvertFromIDToIDByte(CString &strIDByte,CString strID)
{
	CString strTem;
	unsigned int iID;
	char szFrameID[9];
	unsigned char FrameID[4] = {0,0,0,0};

	if(strID.GetLength()>8)
	{
		AfxMessageBox("ID超范围!");
		return;
	}
	memset(szFrameID,'0',9);
	memcpy(&szFrameID[8 - strID.GetLength()],(LPCTSTR)strID,strID.GetLength());
	strtodata((unsigned char*)szFrameID,FrameID,4,0);	
	if(m_bExtFrameType)
	{
		iID = ((DWORD)FrameID[0]<<24)+((DWORD)FrameID[1]<<16)+((DWORD)FrameID[2]<<8)+
			((DWORD)FrameID[3]);
	}
	else
	{
		iID = ((DWORD)FrameID[2]<<8)+((DWORD)FrameID[3]);		
	}

	if(m_bExtFrameType)
		iID = iID << 3;
	else
		iID = iID << 5;

	unsigned char *p = NULL;
	p = (unsigned char*)&iID;

	if(m_bExtFrameType)
		strTem.Format("%02x %02x %02x %02x ",*(p + 3),*(p + 2),*(p + 1),*(p + 0));	    
	else
		strTem.Format("%02x %02x ",*(p + 1),*(p + 0));
        
	strIDByte = strTem;
}

int CIDCalculate::strtodata(unsigned char *str, unsigned char *data,int len,int flag)
{
	unsigned char cTmp=0;
	int i=0;
	for(int j=0;j<len;j++)
	{
		if(chartoint(str[i++],&cTmp))
			return 1;
		data[j]=cTmp;
		if(chartoint(str[i++],&cTmp))
			return 1;
		data[j]=(data[j]<<4)+cTmp;
		if(flag==1)
			i++;
	}
	return 0;
}


int CIDCalculate::chartoint(unsigned char chr, unsigned char *cint)
{
	unsigned char cTmp;
	cTmp=chr-48;
	if(cTmp>=0&&cTmp<=9)
	{
		*cint=cTmp;
		return 0;
	}
	cTmp=chr-65;
	if(cTmp>=0&&cTmp<=5)
	{
		*cint=(cTmp+10);
		return 0;
	}
	cTmp=chr-97;
	if(cTmp>=0&&cTmp<=5)
	{
		*cint=(cTmp+10);
		return 0;
	}
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -