常用转换函数汇总

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
unsigned char *crcResult = new unsigned char[2];
crcResult[0] = CRCHi;
crcResult[1] = CRCLo
return crcResult;
}
2.校验CRC码是否正确,输入一个char数组和数组长度,计算方法与上相同。计算出来正确的CRC码后与输入数组的最后两位进行比较,如果相同返回true,不同则返回false。
void CUpdateDlg::Char2Byte(char* pChar, BYTE* pByte)
{
char high,low;
high = pChar[0]; //高位
low = pChar[1]; //低位
if (low >= '0' && low <= '9')
{
low = low - '0';
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))
1.计算CRC码(CRC16)
输入一个char数组以及数组的长度。数组长度包含CRC码。数组类似于“01 02 FA 03 A4…00 00”的格式,返回计算出的CRC码值,并存储到最后两位。次低位存储高字节,最低位存储低字节。
unsigned char* CMyCnComm::CalCRC(char buf[], int cnt)
{
MessageBox(_T("不支持扩展段地址记录!"));
return 0;
}
//当数据类型为04时,表示本行包含的是扩展线性地址记录
else if (dataType == 0x04)
{
MessageBox(_T("不支持扩展线性地址记录!"));
return 0;
}
}
}
myFile.Close();
{
ch = buf[j];
unsigned char BD;
unsigned short i;
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;
{
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;
strTemp += "[ ";
strTemp += str;
strTemp += " ]";
m_ustate.SetWindowText(strTemp);
m_cbUDisk.AddString(str);
flag = TRUE;
}
}
if (!flag)
{
m_ustate.SetWindowText(_T("没有检测到移动设备"));
memset(outBuf,0xff,len/2);
while (myFile.ReadString(line))
{
if (line[0] == ':') //:表示一行的开始
{
//每行的1、2字符表示该行包含的数据长度
data[0] = (char)line[1];
data[1] = (char)line[2];
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;
}
j++;
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);
}
dwFileLen = totalLen; //转换后的二进制文件长度,赋值给dwFileLen
return outBuf;
}
}
8.检测系统中是否存在U盘(并非检测U盘插入拔出事件)。
void CUpdateDlg::DecUDisk(void)
{
int type;
CString str;
bool flag = FALSE;
outBuf[j] = byteData;
j++;
}
totalLen += dataLen;
}
//当数据类型为01时,表明到了最后一行
else if (dataType == 0x01)
{
//MessageBox(_T("文件结束"));
}
//当数据类型为02时,表示本行包含的是扩展段地址记录
else if (dataType == 0x02)
{
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文件做准备。
#endif
return ptr;
}
4.字符转换为16进制字符。
char CMyCnComm::OnChar2Hexchar(char c)
{
if((c>='0')&&(c<='9'))
return c-0x30;
else if((c>='A')&&(c<='F'))
return c-'A'+10;
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)
data[1] = (char)line[6];
Char2Byte(data,&addressLow);
//每行的7、8字符表示数据类型
data[0] = (char)line[7];
data[1] = (char)line[8];
Char2Byte(data,&dataType);
//当数据类型为00时,表示本行包含的是普通数据记录
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];
BYTE addressHigh;
BYTE addressLow;
BYTE dataLen;
BYTE dataType;
BYTE byteData;
int totalLen;
CString line;
totalLen = 0;
len = 0;
addressHigh = 0;
addressLow = 0;
lCF=false;
hCF=false;
}
j++;
}
if (buf[cnt-2]==CRCHi&&buf[cnt-1]==CRCLo)
{
return true;
}
else
{
return false;
}
}
3.CString转换为char*.在VS2008中转换时貌似因为wchar的问题使某些转换发生错误。下面这种方法是没有问题的。
if((CRCLo&0x80)==0x80)lCF=true;
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;
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 += "检测到移动硬盘:";
}
}
9.寻找磁盘驱动器号的函数(为检测系统移动硬盘插入拔出事件服务)。
}
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')
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;
}
7.将HEX文件转换为BIN文件。关于HEX文件和BIN文件的定义请百度。
BYTE* CUpdateDlg::HexF2BinF(CStringstrUFileName)
{
char data[2];
BYTE *outBuf;
CStdioFile myFile;
DWORD len;
int i;
int j = 0;
Char2Byte(data,&dataLen);
//每行的3、4字符表示数据存储起始地址的高位
data[0] = (char)line[3];
data[1] = (char)line[4];
Char2Byte(data,&addressHigh);
//每行的5、6字符表示数据存储起始地址的低位
data[0] = (char)line[5];
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;
{
MessageBox(_T("打开hex文件失败"));
}
else
{
len = (DWORD)myFile.GetLength();
//因为是每两个字符表示一个字节,所以最大的数据个数要少于文件字符个数的一半。所以BIN文件要比HEX文件小一半多。
outBuf = (BYTE*)malloc(len/2);
{
unsigned char CRCHi=0x00,CRCLo=0x00,CRCGXHi=0x10,CRCGXLo=0x21;
unsigned char ch;
int j = 0;
while( j < cnt-2)
{
ch = buf[j];
unsigned char BD;
unsigned short i;
else if((c>='a')&&(c<='f'))
return c-'a'+10;
else
return 0x10;
}
5.将从文件中读取的二进制BYTE流转换为以16进制显示的CString。
CString CMyCnComm::TranBin2Hex(BYTE* pChar, DWORD len)
相关文档
最新文档