您的位置:首页 > 编程语言 > C语言/C++

读取文件,判断是否含有固定字符串

2017-06-05 19:10 260 查看
项目中,需要通过文件设备,A设备升级文件为a.bin,B设备升级文件为b.bin,不同的设备对应的升级文件是不同的。

设备升级时对文件的校验很是重要,单纯的从文件名称校验,是很不安全的,因为可以将任何文件修改成所需文件名称。

这里可以认为是“挂羊头卖狗肉”。

通常,升级文件中的某些关键字符串,比如a.bin中有的字符串为“helloword”。

那么文件检验的问题,就转换为在a.bin文件中查找字符串“helloword”,找到则说明确实是A设备所需的升级包,反之则不是。

下面搜索度娘、谷歌,“字符串匹配”等字样,你会找到一大堆的资料。你会惊讶的发现,好像很难符合,可能本人没找对方法。

打开二进制文件,你会发现一大堆的乱码,然后你会惊喜的看到关键字符串是“FFF黟 F? h e l l o  w o r d L%N嚆h”

关键字不是连续的,而是有空格的。

这里采用一种方法,“拼关键字符串”,既然可以通过其他工具打开文件,那么可以在源文件中找到关键字符串对应的长度L,

然后找到第一个字符对应的位置,向后取L个字符,拼起来就是了(自己动手丰衣足食)。

bool CDfuSeDemoDlg::checkFile(CString file)

{
bool ckret = false;
//读模式构造函数,在自身目录下建立文件,不存在就创建,创建时不修改原有内容  
CFile file(file, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeRead);
//待写容器  
CString strPath;
//暂存字符数组  
char* ptchBuffer = NULL;
//统计字的个数  
int nCount = file.GetLength();
//+1来用于最后的终止符  
ptchBuffer = new char[CHECK_DFU_LEN];
ptchBuffer[CHECK_DFU_LEN] = '\0';
//读入  
file.Read(ptchBuffer, CHECK_DFU_LEN);
file.Close();

for (int i = 0; i < CHECK_DFU_LEN - 10; i++)
{
CString str = "";
if (ptchBuffer[i] == 'h')
{
for (int j = i; j <= i + 16; j += 2)
{
str += ptchBuffer[j];
}
if (str == "helloword")
{
ckret = true;
}
}
}

return ckret;

}

废话比较多,说来惭愧,想了一天才想到的,所有多啰嗦啰嗦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 字符串查找
相关文章推荐