HRESULT CPatchDlg::DownloadFile(CString srvPath,CString savePath,BOOL checkCrc,DWORD crc) { CBkUpdDownloader downloader(TRUE); HRESULT hr; CBkUpdWebFile file; CString sSaveDir=savePath; DWORD dwCliCrc=0; int i=0; CString sFileName; PathRemoveFileSpec(sSaveDir.GetBuffer()); if(!PathIsDirectory(sSaveDir)) hr=CAppPath::Instance().CreateFullPath(sSaveDir); //先比较下载文件是否存在 if(PathFileExists(savePath)) { dwCliCrc=CalcCrc(savePath); if(dwCliCrc!=crc) //校验不通过,重新下载 { goto Download; } else { hr=S_OK; goto Done; } } Download: file.SetFileName(savePath); sFileName=PathFindFileName(savePath); GetDlgItem(IDC_STC_DOWNLOAD_FILE)->ShowWindow(SW_SHOW); GetDlgItem(IDC_PGS_DOWNLOAD_FILE)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STC_DOWNLOAD_FILE)->SetWindowText(sFileName); do{ hr = downloader.Download(srvPath, (IBkUpdWebFile*)&file, this); dwCliCrc=CalcCrc(savePath); i++; } while(hr==S_OK && checkCrc && i<=nCrc32Retry && dwCliCrc!=crc); if(dwCliCrc!=crc && checkCrc) { if(bCrcChecekUp) bCrcChecekUp=FALSE; sCrcHint.AppendFormat(_T("%-38s校验不通过,客户端:%08x,服务端:%08x.\r\n"), sFileName,dwCliCrc,crc); } Done: GetDlgItem(IDC_STC_DOWNLOAD_FILE)->ShowWindow(SW_HIDE); GetDlgItem(IDC_PGS_DOWNLOAD_FILE)->ShowWindow(SW_HIDE); return hr; }
bool CIntelHexRec::InitFromString(string str) { string strVal; char *pEnds; unsigned long uVal; int i; string::size_type strLen; string::size_type start, end; start = str.find_first_not_of(' '); end = str.find_last_not_of(' '); str = str.substr(start, end); if ((str.size() < 10) || (str[0] != ':')) return false; errno = 0; // extract size strVal = str.substr(1, 2); uVal = strtoul(strVal.c_str(), &pEnds, 16); if ((*pEnds) || errno || (uVal > 255)) return false; m_Size = (unsigned char)uVal; strLen = m_Size * 2 + 11; if (str.size() != strLen) return false; // extract address strVal = str.substr(3, 4); uVal = strtoul(strVal.c_str(), &pEnds, 16); if ((*pEnds) || errno || (uVal > 0xFFFF)) return false; m_Addr = (unsigned short)uVal; // extract type strVal = str.substr(7, 2); uVal = strtoul(strVal.c_str(), &pEnds, 16); if ((*pEnds) || errno || (uVal > 4)) return false; m_Type = (unsigned char)uVal; // extract data for (i = 0; i < m_Size; i++) { strVal = str.substr(9+i*2, 2); uVal = strtoul(strVal.c_str(), &pEnds, 16); if ((*pEnds) || errno || (uVal > 0xFF)) return false; m_Data[i] = (unsigned char)uVal; } // compare crc strVal = str.substr(9+m_Size*2, 2); uVal = strtoul(strVal.c_str(), &pEnds, 16); if ((*pEnds) || errno || (uVal > 0xFF)) return false; if (CalcCrc()!=(unsigned char)uVal) return false; return true; }
static int CheckCrc( void const *data, unsigned short len, unsigned short c1, unsigned short c2 ) { unsigned short crc1 = 0; unsigned short crc2 = 0; CalcCrc(data, len, &crc1, &crc2); return ((c1 == crc1) && (c2 == crc2)); }
CString CIntelHexRec::GetString() { CString Res, strTmp; Res.Format(":%02X%04X%02X", m_Size, m_Addr, m_Type); for (int i = 0; i < m_Size; i++) { strTmp.Format("%02X", m_Data[i]); Res+=strTmp; } strTmp.Format("%02X\n", CalcCrc()); Res+=strTmp; return Res; }
bool CIntelHexRec::InitFromString(CString str) { CString strVal; char *pEnds; ULONG uVal; int strLen, i; str.TrimLeft(); str.TrimRight(); if ((str.GetLength() < 10) || (str[0] != ':')) return false; errno = 0; // extract size strVal = str.Mid(1, 2); uVal = strtoul(strVal, &pEnds, 16); if ((*pEnds) || errno || (uVal > 255)) return false; m_Size = (BYTE)uVal; strLen = m_Size * 2 + 11; if (str.GetLength() != strLen) return false; // extract address strVal = str.Mid(3, 4); uVal = strtoul(strVal, &pEnds, 16); if ((*pEnds) || errno || (uVal > 0xFFFF)) return false; m_Addr = (USHORT)uVal; // extract type strVal = str.Mid(7, 2); uVal = strtoul(strVal, &pEnds, 16); if ((*pEnds) || errno || (uVal > 4)) return false; m_Type = (BYTE)uVal; // extract data for (i = 0; i < m_Size; i++) { strVal = str.Mid(9+i*2, 2); uVal = strtoul(strVal, &pEnds, 16); if ((*pEnds) || errno || (uVal > 0xFF)) return false; m_Data[i] = (BYTE)uVal; } // compare crc strVal = str.Mid(9+m_Size*2, 2); uVal = strtoul(strVal, &pEnds, 16); if ((*pEnds) || errno || (uVal > 0xFF)) return false; if (CalcCrc()!=(BYTE)uVal) return false; return true; }
string CIntelHexRec::GetString() { string pc = ""; const size_t buffer_size = 20; char strTmp[buffer_size]; sprintf(strTmp, ":%02X%04X%02X", m_Size, m_Addr, m_Type); pc += strTmp; for (int i = 0; i < m_Size; i++) { sprintf(strTmp, "%02X", m_Data[i]); pc+=strTmp; } sprintf(strTmp, "%02X\n", CalcCrc()); pc += strTmp; return pc; }
//-------------------------------------------------------------------- WORD CModbus::loopback() { WORD temp; BYTE ByteArray[8]; BYTE RByteArray[10]; WORD Hi,Lo; unsigned long lpWbytes,lpRbytes; WORD Error=0; ByteArray[0]=this->wAddress; ByteArray[1]=8; ByteArray[2]=0; ByteArray[3]=0; ByteArray[4]=0; ByteArray[5]=0; temp=CalcCrc(ByteArray,6); Hi=temp>>8; ByteArray[6]=(BYTE)Hi; Lo=temp&0x00ff; ByteArray[7]=(BYTE)Lo; if (WriteFile(hCom,ByteArray,8,&lpWbytes,NULL)) { PurgeComm(hCom,PURGE_RXCLEAR | PURGE_TXCLEAR); if(ReadFile(hCom,RByteArray,8,&lpRbytes,0)) { if(lpRbytes!=0) { for (int i=0;i<8;i++) //Если полученный пакет отличается от отправленного if (ByteArray[i]!=RByteArray[i]) Error^=ERR_INVALID_ANSWER; } else //Если число считанных байт=0 Error^=ERR_NO_READ_BYTES; } else //Если ошибка в ReadFile Error^=ERR_READFILE; } else //Если ошибка в WriteFile Error^=ERR_WRITEFILE; return (Error); }
HRESULT CPatchDlg::GetMoudleList() { DWORD ret=0; //根据服务端文件列表.找到当前目录,文件版本 HRESULT hr=S_OK; POSITION pos=m_mapSvrFileVersion.GetStartPosition(); PFILEUPDATESVRDATA pData=NULL; PFILEUPDATECLIDATA pCliData=NULL; CString sKey; BOOL bDiff=FALSE; CString sFilePath; CString sVersion; CString sFileName; CFileFind ff; BOOL bFound =FALSE; m_mapCliFileVersion.RemoveAll(); //sUpdataPath.AppendFormat(_T("%s\\%s"),sAppPath,sSavePath); TiXmlDocument doc; TiXmlElement *root=new TiXmlElement("dsFileVersion"); TiXmlDeclaration *d=new TiXmlDeclaration("1.0","utf-8",""); doc.LinkEndChild(d); doc.LinkEndChild(root); TiXmlElement *nodeId, *nodeFn, *nodeFv; do{ //bDiff=FALSE; pData=NULL; bFound=FALSE; sFilePath.Empty(); sVersion.Empty(); m_mapSvrFileVersion.GetNextAssoc(pos,sKey,(LPVOID&)pData); sFilePath.AppendFormat(_T("%s\\%s"),sAppPath,pData->sFileName); bFound=PathFileExists(sFilePath.GetString()); if(bFound) { pCliData=new FILEUPDATECLIDATA(); GetFileVersion(sFilePath.GetString(),sVersion); sFileName=pData->sFileName; pCliData->sFileName=sFileName; if(!sVersion.IsEmpty()) //有些文件没有版本号 pCliData->sVersion=sVersion; pCliData->nCrc32=CalcCrc(sFilePath); m_mapCliFileVersion.SetAt(sFileName.MakeUpper(),pCliData); TiXmlElement *eTable=new TiXmlElement("sc_FileVersion"); root->LinkEndChild(eTable); nodeId=new TiXmlElement("ID"); nodeFn=new TiXmlElement("FileName"); nodeFv=new TiXmlElement("FileVersion"); TiXmlText *fnContent =new TiXmlText(CT2A(pCliData->sFileName.GetString())); TiXmlText *fvContent =new TiXmlText(CT2A(pCliData->sVersion.GetString())); nodeFn->LinkEndChild(fnContent); nodeFv->LinkEndChild(fvContent); eTable->LinkEndChild(nodeId); eTable->LinkEndChild(nodeFn); eTable->LinkEndChild(nodeFv); //Log(_T("客户端文件:%-25s,版本:%10s\r\n"),pCliData->sFileName,pCliData->sVersion); } }while(pos!=NULL); TiXmlPrinter printer; doc.Accept(&printer); CStringA str2=printer.CStr(); CString str=CA2T(str2); return ret; }
uint16_t CRC::CalcCrc(const openpal::RSlice& view) { return CalcCrc(view, view.Size()); }
int main( int argc, char **argv ) { FILE *fp; char *game_file; int level = 0; int old_level = 0; (void) printf(&title_msg[WHAT_OFFSET]); /*lint -e506 Ignore constat boolean */ assert(sizeof(SAVED_GAME) == SAVED_GAME_SIZE); /*lint +e506 Ignore constat boolean */ if (argc != 3) { (void) printf("Usage: SetLevel (saved game) (level)\n"); (void) printf(" 1 - Rookie\n"); (void) printf(" 2 - Amateur\n"); (void) printf(" 3 - Semi-Pro\n"); (void) printf(" 4 - Pro\n"); (void) printf(" 5 - Ace\n"); return -1; } game_file = argv[1]; level = atoi(argv[2]); if (level < 1 || level > 5) { (void) printf("SetLevel: The level value should be between 1 and 5.\n"); return -1; } --level; if ((fp = fopen(game_file, "rb+")) == NULL) { (void) printf("SetLevel: Unable to open saved game file called '%s'\n", game_file); return -1; } if (fread(&game, sizeof(game), 1, fp) != 1) { (void) printf("SetLevel: Unable to read from saved game file called '%s'\n", game_file); return -1; } if (!CheckCrc(&game, sizeof(game), game.crc1, game.crc2)) { (void) printf("SetLevel: '%s' doesn't appear to be a valid saved game file.\n", game_file); return -1; } /* ** Update level and recalculate CRC. */ old_level = game.data[LEVEL_OFFSET]; game.data[LEVEL_OFFSET] = (unsigned char) level; CalcCrc(&game, sizeof(game), &game.crc1, &game.crc2); (void) fseek(fp, 0L, SEEK_SET); if (fwrite(&game, sizeof(game), 1, fp) != 1) { (void) printf("SetLevel: Unable to write to saved game file called '%s'\n", game_file); return -1; } (void) printf("Updated saved game '%s' from '%s' to '%s'\n", game_file, level_txt[old_level], level_txt[level]); (void) fclose(fp); return 0; }
int main( int argc, char **argv ) { FILE *ifp; FILE *ofp; char *name_file; char *game_file; (void) printf(&title_msg[WHAT_OFFSET]); /*lint -e506 Ignore constat boolean */ assert(sizeof(SAVED_GAME) == SAVED_GAME_SIZE); /*lint +e506 Ignore constat boolean */ if (argc != 3) { (void) printf("Usage: SetNames (name file) (saved game)\n"); return -1; } name_file = argv[1]; game_file = argv[2]; if ((ifp = fopen(name_file, "rb")) == NULL) { (void) printf("SetNames: Unable to open names file called '%s'\n", name_file); return -1; } if ((ofp = fopen(game_file, "rb+")) == NULL) { (void) printf("SetNames: Unable to open saved game file called '%s'\n", game_file); return -1; } if (fread(&names, sizeof(names), 1, ifp) != 1) { (void) printf("SetNames: Unable to read from names file called '%s'\n", name_file); return -1; } if (!CheckCrc(&names, sizeof(names), names.crc1, names.crc2)) { (void) printf("SetNames: '%s' doesn't appear to be a valid names file.\n", name_file); return -1; } if (fread(&game, sizeof(game), 1, ofp) != 1) { (void) printf("SetNames: Unable to read from saved game file called '%s'\n", game_file); return -1; } if (!CheckCrc(&game, sizeof(game), game.crc1, game.crc2)) { (void) printf("SetNames: '%s' doesn't appear to be a valid saved game file.\n", name_file); return -1; } /* ** Copy names and recalculate CRC. */ (void) memcpy(&game.names, &names, sizeof(game.names) - CRC_SIZE); CalcCrc(&game, sizeof(game), &game.crc1, &game.crc2); (void) fseek(ofp, 0L, SEEK_SET); if (fwrite(&game, sizeof(game), 1, ofp) != 1) { (void) printf("SetNames: Unable to write to saved game file called '%s'\n", name_file); return -1; } (void) printf("Updated saved game '%s' with names from '%s'\n", game_file, name_file); (void) fclose(ifp); (void) fclose(ofp); return 0; }
bool DNPCrc::IsCorrectCRC(const uint8_t* aInput, size_t aLength) { return CalcCrc(aInput, aLength) == UInt16LE::Read(aInput + aLength); }