如何二进制文件查找替换特定字符??求助大神!

极客站长 2013-09-25 05:06:54
需求是,一个exe文件用ue查看有一串字符比如是dddd,我要查找这串字符,并替换成别的字符,请教有什么办法,我是菜鸟,请教大神,能给个思路吗,最好把相关的函数给我,当然,有例程的话最好了。
...全文
299 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-09-27
  • 打赏
  • 举报
回复
我的代码要求源文件和目标文件必须不同,目标文件必须不存在。
赵4老师 2013-09-27
  • 打赏
  • 举报
回复
Find   :dd dd
Replace:ee ee
极客站长 2013-09-27
  • 打赏
  • 举报
回复
引用 7 楼 sduxiaoxiang 的回复:
Ue中可以直接改
可是我要写成程序
sduxiaoxiang 2013-09-26
  • 打赏
  • 举报
回复
Ue中可以直接改
极客站长 2013-09-26
  • 打赏
  • 举报
回复
@zhao4zhong1
不行,试过了
赵4老师 2013-09-26
  • 打赏
  • 举报
回复
Find   :'dddd
Replace:'eeee
极客站长 2013-09-26
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN  40
#define MAX2N 80
FILE *fi,*fo;
char sn[_MAX_PATH],dn[_MAX_PATH],f[MAX2N],bw[MAXN],bf[MAXN+sizeof(int)-1],bx[MAXN],br[MAXN+sizeof(int)-1],bb[MAXN];
char *ag[MAXN];
int L,i,j,k,lenf,lenr,find,match;
__int64 off;
void FR() {
    printf("\n");
    printf("Src : %s\n",sn);
    if (find==0) {
        printf("Dest: %s\n",dn);
    }
    for (i=0;i<lenf;i++) {
        bb[i]=fgetc(fi);
    }
    off=0i64;
    while (1) {
        match=1;
        for (j=0;j<lenf;j++) {
            if (bw[j]==0&&bf[j]==bb[j]) continue;
            if (bw[j]==1) continue;
            match=0;
            break;//
        }
        if (match==1) {
            printf("%016I64X\n",off);
            if (find==0) {
                for (j=0;j<lenf;j++) {
                    if (bx[j]==0) fputc(br[j],fo);
                    else fputc(bb[j],fo);
                }
            }
            for (i=0;i<lenf;i++) {
                bb[i]=fgetc(fi);
                if (feof(fi)) break;//
            }
            if (feof(fi)&&find==0) {
                for (j=0;j<i;j++) fputc(bb[j],fo);
                break;//
            }
            if (feof(fi)) break;//
            else off+=(__int64)lenf;
        } else {
            if (find==0) {
                fputc(bb[0],fo);
            }
            memmove(bb,bb+1,lenf-1);
            bb[lenf-1]=fgetc(fi);
            off++;
            if (feof(fi)) {
                if (find==0) {
                    for (j=0;j<lenf-1;j++) fputc(bb[j],fo);
                }
                break;//
            }
        }
    }
}
int main() {
    while (1) {
        printf("Find & Replace, designed by zhao4zhong1@163.com\n");
        printf("Src  file name:");
        fflush(stdout);
        fgets(sn,_MAX_PATH,stdin);
        if ('\n'==sn[0]) break;//
        L=strlen(sn);if ('\n'==sn[L-1]) sn[L-1]=0;
        if ((fi=fopen(sn,"rb"))==NULL) {
            printf("Can not open %s!",sn);
            break;//
        }
        while (1) {
            printf("Dest file name:");
            fflush(stdout);
            fgets(dn,_MAX_PATH,stdin);
            if ('\n'==dn[0]) break;//
            L=strlen(dn);if ('\n'==dn[L-1]) dn[L-1]=0;
            if (strcmpi(sn,dn)==0) printf("Error: Src file name[%s] == Dest file name[%s]!\n",sn,dn);
            else if ((fo=fopen(dn,"rb"))!=NULL) {
                fclose(fo);
                printf("Error: Dest file already exists!\n");
            } else break;//
        }
        printf("Find   :");
        fflush(stdout);
        fgets(f,MAX2N,stdin);
        L=strlen(f);if ('\n'==f[L-1]) f[L-1]=0;
        if (f[0]=='\'') {
            lenf=strlen(f)-1;
            for (j=0;j<lenf;j++) {
                if (f[j+1]=='?') bw[j]=1;
                else {
                    bw[j]=0;
                    bf[j]=f[j+1];
                }
            }
        } else {
            i=0;
            for (j=0;j<MAXN;j++) {
                if (f[i]==0x0D||f[i]==0x0A||f[i]==0x1A||f[i]==0) {
                    f[i]=0;
                    break;//
                }
                while (f[i]==' '||f[i]==9) {
                    f[i]=0;
                    i++;
                }
                ag[j]=f+i;
                while (f[i]!=9&&f[i]!=' '&&f[i]!=0x0D&&f[i]!=0x0A&&f[i]!=0x00) i++;
            }
            lenf=j;
            for (i=0;i<lenf;i++) {
                if (isxdigit(ag[i][0])) {
                    bw[i]=0;
                    sscanf(ag[i],"%2x",&bf[i]);
                } else {
                    bw[i]=1;
                }
            }
        }
        printf("Replace:");
        fflush(stdout);
        fgets(f,MAX2N,stdin);
        L=strlen(f);if ('\n'==f[L-1]) f[L-1]=0;
        if (f[0]==0 || '\n'==dn[0]) find=1;
        else {
            if (f[0]=='\'') {
                lenr=strlen(f)-1;
                if (lenr!=lenf) {
                    printf("Error: Find len != Replace len");
                    fclose(fi);
                    break;//
                }
                find=0;
                fo=fopen(dn,"wb");
                for (j=0;j<lenr;j++) {
                    if (f[j+1]=='?') bx[j]=1;
                    else {
                        bx[j]=0;
                        br[j]=f[j+1];
                    }
                }
            } else {
                i=0;
                for (j=0;j<MAXN;j++) {
                    if (f[i]==0x0D||f[i]==0x0A||f[i]==0x1A||f[i]==0) {
                        f[i]=0;
                        break;//
                    }
                    while (f[i]==' '||f[i]==9) {
                        f[i]=0;
                        i++;
                    }
                    ag[j]=f+i;
                    while (f[i]!=9&&f[i]!=' '&&f[i]!=0x0D&&f[i]!=0x0A&&f[i]!=0x00) i++;
                }
                lenr=j;
                if (lenr!=lenf) {
                    printf("Error: Find len != Replace len");
                    fclose(fi);
                    break;//
                }
                find=0;
                fo=fopen(dn,"wb");
                for (i=0;i<lenr;i++) {
                    if (isxdigit(ag[i][0])) {
                        bx[i]=0;
                        sscanf(ag[i],"%2x",&br[i]);
                    } else {
                        bx[i]=1;
                    }
                }
            }
        }
        if (lenf<=0) break;//
        FR();
        fcloseall();
    }
    return 0;
}
我这适用了下,不能实现,不过还是谢谢帮忙了
  • 打赏
  • 举报
回复
直接用ue不能查找?
赵4老师 2013-09-25
  • 打赏
  • 举报
回复
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN  40
#define MAX2N 80
FILE *fi,*fo;
char sn[_MAX_PATH],dn[_MAX_PATH],f[MAX2N],bw[MAXN],bf[MAXN+sizeof(int)-1],bx[MAXN],br[MAXN+sizeof(int)-1],bb[MAXN];
char *ag[MAXN];
int L,i,j,k,lenf,lenr,find,match;
__int64 off;
void FR() {
    printf("\n");
    printf("Src : %s\n",sn);
    if (find==0) {
        printf("Dest: %s\n",dn);
    }
    for (i=0;i<lenf;i++) {
        bb[i]=fgetc(fi);
    }
    off=0i64;
    while (1) {
        match=1;
        for (j=0;j<lenf;j++) {
            if (bw[j]==0&&bf[j]==bb[j]) continue;
            if (bw[j]==1) continue;
            match=0;
            break;//
        }
        if (match==1) {
            printf("%016I64X\n",off);
            if (find==0) {
                for (j=0;j<lenf;j++) {
                    if (bx[j]==0) fputc(br[j],fo);
                    else fputc(bb[j],fo);
                }
            }
            for (i=0;i<lenf;i++) {
                bb[i]=fgetc(fi);
                if (feof(fi)) break;//
            }
            if (feof(fi)&&find==0) {
                for (j=0;j<i;j++) fputc(bb[j],fo);
                break;//
            }
            if (feof(fi)) break;//
            else off+=(__int64)lenf;
        } else {
            if (find==0) {
                fputc(bb[0],fo);
            }
            memmove(bb,bb+1,lenf-1);
            bb[lenf-1]=fgetc(fi);
            off++;
            if (feof(fi)) {
                if (find==0) {
                    for (j=0;j<lenf-1;j++) fputc(bb[j],fo);
                }
                break;//
            }
        }
    }
}
int main() {
    while (1) {
        printf("Find & Replace, designed by zhao4zhong1@163.com\n");
        printf("Src  file name:");
        fflush(stdout);
        fgets(sn,_MAX_PATH,stdin);
        if ('\n'==sn[0]) break;//
        L=strlen(sn);if ('\n'==sn[L-1]) sn[L-1]=0;
        if ((fi=fopen(sn,"rb"))==NULL) {
            printf("Can not open %s!",sn);
            break;//
        }
        while (1) {
            printf("Dest file name:");
            fflush(stdout);
            fgets(dn,_MAX_PATH,stdin);
            if ('\n'==dn[0]) break;//
            L=strlen(dn);if ('\n'==dn[L-1]) dn[L-1]=0;
            if (strcmpi(sn,dn)==0) printf("Error: Src file name[%s] == Dest file name[%s]!\n",sn,dn);
            else if ((fo=fopen(dn,"rb"))!=NULL) {
                fclose(fo);
                printf("Error: Dest file already exists!\n");
            } else break;//
        }
        printf("Find   :");
        fflush(stdout);
        fgets(f,MAX2N,stdin);
        L=strlen(f);if ('\n'==f[L-1]) f[L-1]=0;
        if (f[0]=='\'') {
            lenf=strlen(f)-1;
            for (j=0;j<lenf;j++) {
                if (f[j+1]=='?') bw[j]=1;
                else {
                    bw[j]=0;
                    bf[j]=f[j+1];
                }
            }
        } else {
            i=0;
            for (j=0;j<MAXN;j++) {
                if (f[i]==0x0D||f[i]==0x0A||f[i]==0x1A||f[i]==0) {
                    f[i]=0;
                    break;//
                }
                while (f[i]==' '||f[i]==9) {
                    f[i]=0;
                    i++;
                }
                ag[j]=f+i;
                while (f[i]!=9&&f[i]!=' '&&f[i]!=0x0D&&f[i]!=0x0A&&f[i]!=0x00) i++;
            }
            lenf=j;
            for (i=0;i<lenf;i++) {
                if (isxdigit(ag[i][0])) {
                    bw[i]=0;
                    sscanf(ag[i],"%2x",&bf[i]);
                } else {
                    bw[i]=1;
                }
            }
        }
        printf("Replace:");
        fflush(stdout);
        fgets(f,MAX2N,stdin);
        L=strlen(f);if ('\n'==f[L-1]) f[L-1]=0;
        if (f[0]==0 || '\n'==dn[0]) find=1;
        else {
            if (f[0]=='\'') {
                lenr=strlen(f)-1;
                if (lenr!=lenf) {
                    printf("Error: Find len != Replace len");
                    fclose(fi);
                    break;//
                }
                find=0;
                fo=fopen(dn,"wb");
                for (j=0;j<lenr;j++) {
                    if (f[j+1]=='?') bx[j]=1;
                    else {
                        bx[j]=0;
                        br[j]=f[j+1];
                    }
                }
            } else {
                i=0;
                for (j=0;j<MAXN;j++) {
                    if (f[i]==0x0D||f[i]==0x0A||f[i]==0x1A||f[i]==0) {
                        f[i]=0;
                        break;//
                    }
                    while (f[i]==' '||f[i]==9) {
                        f[i]=0;
                        i++;
                    }
                    ag[j]=f+i;
                    while (f[i]!=9&&f[i]!=' '&&f[i]!=0x0D&&f[i]!=0x0A&&f[i]!=0x00) i++;
                }
                lenr=j;
                if (lenr!=lenf) {
                    printf("Error: Find len != Replace len");
                    fclose(fi);
                    break;//
                }
                find=0;
                fo=fopen(dn,"wb");
                for (i=0;i<lenr;i++) {
                    if (isxdigit(ag[i][0])) {
                        bx[i]=0;
                        sscanf(ag[i],"%2x",&br[i]);
                    } else {
                        bx[i]=1;
                    }
                }
            }
        }
        if (lenf<=0) break;//
        FR();
        fcloseall();
    }
    return 0;
}
乃不知有汉 2013-09-25
  • 打赏
  • 举报
回复
template<typename T, typename F>
struct EnsureClose
{
    EnsureClose(const T& t, F f) : m_func(f), m_t(t), need_close(true) {}
    ~EnsureClose() { if (need_close) m_func(m_t); }

    bool need_close;
    F m_func;
    T m_t;
};

bool ReadFile(const char* filePath, string& content)
{
    FILE* fp = fopen(filePath, "rb");
    if (!fp)
        return false;
    EnsureClose<FILE*, int (*)(FILE*)> ec(fp, fclose);

    // Get file length
    fseek(fp, 0, SEEK_END);
    int len = ftell( fp );
    fseek(fp, 0, SEEK_SET);

    if (len == 0)
        return true;

    vector<char> buf(len);
    fread(&buf[0], len, 1, fp);
    content.assign(&buf[0], len);
    return true;
}

void   Replace(string&   str,const   string&   old_value,const   string&   new_value)  
{  
    while(true)   {  
        string::size_type   pos(0);  
        if(   (pos=str.find(old_value))!=string::npos   )  
            str.replace(pos,old_value.length(),new_value);  
        else   break;  
    }   
}

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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