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

来源:互联网 发布:中船重工 知乎 编辑:程序博客网 时间:2024/06/05 05:57

项目中,需要通过文件设备,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;
}


废话比较多,说来惭愧,想了一天才想到的,所有多啰嗦啰嗦

原创粉丝点击