常用转换函数汇总
bool sCF,lCF,hCF;
BD=ch;
sCF=false;
lCF=false;
hCF=false;
for(i=0;i<8;i++)
{
if((BD&0x80)==0x80)sCF=true;
if((CRCHi&0x80)==0x80)hCF=true;
if((CRCLo&0x80)==0x80)lCF=true;
}
7.将HEX文件转换为BINg::HexF2BinF(CStringstrUFileName)
{
char data[2];
BYTE *outBuf;
CStdioFile myFile;
DWORD len;
int i;
int j = 0;
data[1] = (char)line[6];
Char2Byte(data,&addressLow);
//每行的7、8字符表示数据类型
data[0] = (char)line[7];
data[1] = (char)line[8];
Char2Byte(data,&dataType);
//当数据类型为00时,表示本行包含的是普通数据记录
else if((c>='a')&&(c<='f'))
return c-'a'+10;
else
return 0x10;
}
5.将从文件中读取的二进制BYTE流转换为以16进制显示的CString。
CString CMyCnComm::TranBin2Hex(BYTE* pChar, DWORD len)
strTemp += "[ ";
strTemp += str;
strTemp += " ]";
m_ustate.SetWindowText(strTemp);
m_cbUDisk.AddString(str);
flag = TRUE;
}
}
if (!flag)
{
m_ustate.SetWindowText(_T("没有检测到移动设备"));
dataLen = 0;
dataType = 0;
if (strUFileName == "")
{
MessageBox(_T("请先选择升级文件(HEX)!"),_T("提示"),MB_ICONINFORMATION);
return NULL;
}
else
{
if (!myFile.Open(strUFileName,CStdioFile::shareDenyNone | CStdioFile::modeRead|CStdioFile::typeText))
{
CString str;
for(DWORD i=0;i<len;i++)
{
CString s;
s.Format(_T("%02X"),pChar[i]);
str+=s;
}
return str;
}
6.将两个字符转换为一个字节量。如“11 00 12…34 00”这样的字符串,读取时是作为字符‘1’‘1’‘0’‘0’等等读取的。为将HEX文件转换为BIN文件做准备。
{
MessageBox(_T("不支持扩展段地址记录!"));
return 0;
}
//当数据类型为04时,表示本行包含的是扩展线性地址记录
else if (dataType == 0x04)
{
MessageBox(_T("不支持扩展线性地址记录!"));
return 0;
}
}
}
myFile.Close();
{
high = high - '0';
}
else if (high >= 'a' && high <= 'f')
{
high = high - 'a' + 0x0a;
}
else if (high >= 'A' && high <= 'F')
{
high = high - 'A' +0x0a;
}
*pByte = (BYTE)high*16 + low;
char* CMyCnComm::CString2Char(CString str)
{
char *ptr;
#ifdef _UNICODE
LONG len;
len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
ptr = new char [len+1];
if (dataType == 0x00)
{
for (i=0;i<dataLen*2;i+=2)
{
data[0] = (char)line[9+i];
data[1] = (char)line[10+i];
Char2Byte(data,&byteData);
//outBuf[addressHigh*256+addressLow+j] = byteData;
}
else if (low >= 'a' && low <= 'f')
{
low = low - 'a' + 0x0a;
}
else if (low >= 'A' && low <= 'F')
{
low = low - 'A' + 0x0a;
}
if (high >= '0' && high <= '9')
bool CMyCnComm::CheckCRC(unsigned char buf[], int cnt)
{
unsigned char CRCHi=0x00,CRCLo=0x00,CRCGXHi=0x10,CRCGXLo=0x21;
unsigned char ch;
int j = 0;
while( j < cnt-2)
for (int i=0;i<20;i++)
{
str.Format(_T("%C:\\"),'A'+i); //A~Z 26个盘符
type = GetDriveType(str);
if (type == DRIVE_REMOVABLE)
{
CString strTemp;
strTemp += "检测到移动硬盘:";
{
MessageBox(_T("打开hex文件失败"));
}
else
{
len = (DWORD)myFile.GetLength();
//因为是每两个字符表示一个字节,所以最大的数据个数要少于文件字符个数的一半。所以BIN文件要比HEX文件小一半多。
outBuf = (BYTE*)malloc(len/2);
}
unsigned char *crcResult = new unsigned char[2];
crcResult[0] = CRCHi;
crcResult[1] = CRCLo
return crcResult;
}
2.校验CRC码是否正确,输入一个char数组和数组长度,计算方法与上相同。计算出来正确的CRC码后与输入数组的最后两位进行比较,如果相同返回true,不同则返回false。
memset(ptr,0,len + 1);
WideCharToMultiByte(CP_ACP, 0, str, -1, ptr, len + 1, NULL, NULL);
#else
ptr = new char [cstr_gcom.GetAllocLength()+1];
sprintf(ptr,_T("%s"),cstr_gcom);
lCF=false;
hCF=false;
}
j++;
}
if (buf[cnt-2]==CRCHi&&buf[cnt-1]==CRCLo)
{
return true;
}
else
{
return false;
}
}
3.CString转换为char*.在VS2008中转换时貌似因为wchar的问题使某些转换发生错误。下面这种方法是没有问题的。
CRCLo=CRCLo<<1;
CRCHi=CRCHi<<1;
if(lCF)CRCHi=CRCHi|0x01;
if(sCF!=hCF)
{
CRCHi=CRCHi^CRCGXHi;
CRCLo=CRCLo^CRCGXLo;
}
BD=BD<<1;
sCF=false;
lCF=false;
hCF=false;