求助:怎样检验二进制文件中某个固定位置的值,如满足条件则替换另一位置的字符串(需批量处理)?

gugeking 2002-10-12 05:44:47
小弟需要一段VC程序,批量替换二进制文件中的字符串,可小弟对VC完全不熟,请高手帮忙!

要求:
在二进制文件中,检验某个固定位置的字符串,如大于等于某个值,就替换另一固定位置的字符串。由于是等长的字符串,不需要重新创建文件。

详细说明:
1,选择某个目录下的所有相同扩展名的文件,如*.dat;
2,避免误改其它扩展名相同但不属于此范围的文件,所以需对文件头进行判断,我需要修改的二进制文件的头几个字符是固定字符串,如23 1B 00 FF。如果是,进一步操作,不是则到下一文件;
3,找到需修改的文件后,到指定位置,如37H(即第56个字节)处,判断那个字节的值是否>=(大于等于)12;
4,如果是,则修改另一个指定位置的字符串,比如8CH(即第141个字节)处,检验其是否为9A,如果是,则由9A替换为9F;如果不是,则不作任何动作;
5,处理下一文件(但不进行重复的搜索/替换);
6,将修改过的文件的日期时间改为当前日期时间;
7,全部完成后,显示完成信息,返回。

希望给出完整的程序,如能给出说明就更好!

谢谢!
...全文
183 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
gugeking 2002-10-18
  • 打赏
  • 举报
回复
我想给贴子加分,以感谢各位的帮助,可惜段位太低,它不让我加分。分数太少,委屈各位了。
gugeking 2002-10-18
  • 打赏
  • 举报
回复
按照sjsj大侠的程序,终于成功了!
sjsj大侠,原来是我犯了低级错误,惭愧!非常感谢你的帮助!我做了一点改动,使它可以打开任意目录,自动寻找目录下所有目标文件。
lihuitomo大侠的程序暂时没有调试通(肯定是我水平问题),不过也是非常感谢!
谢谢各位的帮助!
gugeking 2002-10-17
  • 打赏
  • 举报
回复
按照sjsj大侠的程序,在VC++下调试,出现以下出错信息:

--------------------Configuration: edit0 - Win32 Debug--------------------
Compiling...
edit0.cpp
g:\myvc\edit\edit0.cpp(1) : error C2146: syntax error : missing ';' before identifier 'strFileName'
g:\myvc\edit\edit0.cpp(1) : error C2501: 'CString' : missing storage-class or type specifiers
g:\myvc\edit\edit\edit0.cpp(1) : fatal error C1004: unexpected end of file found
Error executing cl.exe.

edit0.exe - 3 error(s), 0 warning(s)

原因何在?
头文件我设置了很多次,加上各种组合,也尝试了不同的顺序,或者不加任何头文件,结果都是一样。
我想不是程序的问题,应该是我的编译环境有什么问题,问题出在哪里呢?
我也在网上反复搜索过,出现这种问题并没有一个统一的答案。
请各位高手指教!
gugeking 2002-10-15
  • 打赏
  • 举报
回复
能否请sjsj(小帅哥一个)大侠再详加指点?能不能给个完整的程序?
对您来说肯定只是小菜一碟,而小弟试验多次均未成功,问题出在哪里实在是不明白,55555, ……
谢谢!
jian 2002-10-15
  • 打赏
  • 举报
回复
这个程序我已经运行过了,你试试看
jian 2002-10-15
  • 打赏
  • 举报
回复
CString strFileName;//文件名
CFileFind finder;
BOOL bWorking=finder.FindFile("c:\\wavefile\\bak\\*.wav");//要改为dat
while(bWorking)
{
//寻找文件
bWorking=finder.FindNextFile();

//得到文件名
strFileName=finder.GetFilePath();
TRACE("The File Name is : %s\n",strFileName);

//进行文件操作-File Operations
//step 1 of File Operations :打开文件
CFile myFile(strFileName,CFile::modeReadWrite|CFile::shareDenyNone);

//step 2 of File Operations :比较文件头 23 1B 00 FF
//我没有你的文件,所以用了一个wav文件,文件头是52 49 46 46
myFile.SeekToBegin();
BYTE head[4];
myFile.Read(head,4);
if(head[0]==0x52&&head[1]==0x49&&head[2]==0x46&&head[3]==0x46)
{
TRACE("OK,The Head is 0x52 49 46 46\n");
//step 2.1:相同 ,定位到0x37位置,并判断大小
long lData=0x36;//游标
myFile.Seek(lData,CFile::begin);
BYTE B;
myFile.Read(&B,1);
if(B>=12)
{
TRACE("OK ,>+12\n");
//step 2.1.1: 是,定位到0x8c,并与0x9A比较
lData=0x8b;
myFile.Seek(lData,CFile::begin);
myFile.Read(&B,1);
if(B==0x9A)//相等,置为9F
{
TRACE("OK ,it is 0x9A\n");
B=0x9F;
myFile.Seek(lData,CFile::begin);
myFile.Write(&B,1);
}
}
}

//修改文件日期
//这个属性包含三个有创建时间,修改时间(windows自动记录)和访问时间(windows自动记录)

//关闭文件
myFile.Close();
jian 2002-10-15
  • 打赏
  • 举报
回复
你等一下,我给你写一个
gugeking 2002-10-15
  • 打赏
  • 举报
回复
lihuitomo大侠,谢谢谢谢!
信箱是:
gugeking@yahoo.com
期待中!

也谢谢netsbull和各位大侠,这里的高手就是多……
lihuitomo 2002-10-15
  • 打赏
  • 举报
回复
我刚做过一个类似的处理,我发给你吧!
netsbull 2002-10-15
  • 打赏
  • 举报
回复

FindFirstFile
FindNextFile
OpenFile
SetFilePointer
ReadFile
WriteFile
组合一下,轻松搞定了
gugeking 2002-10-13
  • 打赏
  • 举报
回复
非常感谢!
学习中、困惑中、尝试中……
jian 2002-10-12
  • 打赏
  • 举报
回复
我正好刚做过一个类似的程序

1,使用CFileFind类可以搞定
CString strFileTitle;

CFileFind finder;

BOOL bWorking = finder.FindFile(“C:\\windows\\sysbkup\\*.cab”);

while(bWorking)

{

bWorking=finder.FindNextFile();

strFileTitle=finder.GetFileTitle();

}
-----------------------------
2,判断
CFile myFile(sPathName,CFile::×××××××);
myFile.SeekToBegin();
//如果是字符串比较可以这样:
char pBuffer[4];
myFile.Read(pBuffer,4);
while(strcmp(CString(pBuffer[0])+CString(pBuffer[1])+CString(pBuffer[2])+CString(pBuffer[3]),
"data")!=0)
//如果要比较单个字节,可以每次读出一个字节来
------------------------------------------------------------
3,定义一个long类型的数据作为游标
long lData;
那么可以让文件指针定位到任意地方,比如第37个字节
lData=36;
myFile.Seek(lData,CFile::begin);
比较大小:
BYTE B;
myFile.Read(&B,1);
if((unsigned int)B>12)
{
MessageBox(">12");
}


-------------------------------------------------
4,修改:首先用上面的方法定位,然后再次用上面的方法比较
然后,用myFile.Save()存到文件中。
结束对文件的操作之后,不要忘记关闭文件,myFile.Close()

---------------------------
5,循环搜索,在我的step 1中间已经实现

OK,写这么多,我要也吃饭去了

Good Luky
everandforever 2002-10-12
  • 打赏
  • 举报
回复
fread, fopen(...,"r+b"), fwrite
javanew 2002-10-12
  • 打赏
  • 举报
回复
看看fseek lseek
一大梨 2002-10-12
  • 打赏
  • 举报
回复
高手,学习中!

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧